Javascript Date.toJSON не получает смещение часового пояса

Ну, проблема в том, что я использовал такой код:

new Date().toJSON().slice(0, 10)

чтобы получить мою дату как строку YYYY-MM-DD, тогда я использую ее как параметр в некоторых запросах mysql и в некоторых операторах условий. В конце дня я не получал правильную дату, так как он был еще в предыдущий день (мой временной интервал составляет +2/3 часа).

Я не заметил, что метод toJSON не учитывает ваше смещение часового пояса, поэтому я оказался в этом хакерском решении:

var today = new Date();
today.setHours( today.getHours()+(today.getTimezoneOffset()/-60) );
console.log(today.toJSON().slice(0, 10));

Есть ли более элегантное решение?

Ответ 1

Объекты Date в ECMAScript являются внутренними UTC. Смещение временного интервала используется для локальных времен.

Спецификация Date.prototype.toJSON говорит, что использует Date.prototype.toISOString, которая заявляет, что "часовой пояс всегда UTC". То, что делает ваше решение, - это смещение значения времени UTC объекта даты по смещению часового пояса.

Рассмотрим добавление собственного метода в Date.prototype, например.

Date.prototype.toJSONLocal = function() {
  function addZ(n) {
    return (n<10? '0' : '') + n;
  }
  return this.getFullYear() + '-' + 
         addZ(this.getMonth() + 1) + '-' + 
         addZ(this.getDate());
} 

Изменить

Если вы хотите сжать дополнительную производительность, следующее должно быть быстрее:

Date.prototype.toJSONLocal = (function() {
    function addZ(n) {
        return (n<10? '0' : '') + n;
    }
    return function() {
      return this.getFullYear() + '-' +
             addZ(this.getMonth() + 1) + '-' +
             addZ(this.getDate());
    };
}())

Но это отвлекает преждевременную оптимизацию, поэтому, если вы не вызываете ее тысячи раз за очень короткий период, я бы не стал беспокоиться.

Ответ 2

Я не заметил, что метод toJSON не учитывает ваше смещение часового пояса

Но он это делает, он преобразует локальное время в Zulu (посмотрите на конец строки: Z)

new Date( "2012-01-02T03:04:05+02:00" ).toJSON()
"2012-01-02T01:04:05.000Z"