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

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

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

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

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

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

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

2 ответов


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

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

рассмотрите возможность добавления собственного метода на сегодняшний день.прототип, например,

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());
    };
}())

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


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

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

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