Вопрос по date, javascript, timezone – Javascript Date.toJSON не получить смещение часового пояса

9

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

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

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

Here is the test code: http://jsfiddle.net/simo/qwhYw/ JavaScript toJSON Method JavaScript Date Object
Пожалуйста, не используйте w3schools в качестве справочного материала. Для вопросов ECMAScript, пожалуйста, обратитесь к стандарту, например, заDate.prototype.toJSON. RobG

Ваш Ответ

2   ответа
0

t noticed that the toJSON method don't take into account your timezone offset

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

new Date( "2012-01-02T03:04:05+02:00" ).toJSON()
"2012-01-02T01:04:05.000Z"
toJSON не преобразует местное время в Zulu. Объекты Date всегда находятся в формате UTC, при представлении дат в удобочитаемой для человека форме они считают смещение местного часового пояса показом местного времени.
Хорошо, но я хочу, чтобы мое свидание вYYYY-MM-DD форматировать как можно проще. КакиеtoJSON возврат по умолчанию не работает для меня. simo
Вы можете получить только год / месяц / день в часовом поясе клиента и / или в UTC. Во всех других часовых поясах вам нужно конвертировать вручную (форма UTC) или анализировать дату в php с учетом часового пояса, который он содержит.
11

ьзуется для местного времени.

Спецификация для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());
} 
Edit

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

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

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

Ну, код здесь:jsfiddle.net/simo/F4VuF Я не вижу блоков кода в комментариях здесь ... simo
Хорошо, это то, что я должен сделать с самого начала, поэтому я отмечу ваш ответ, но не могли бы вы сказать мне, является ли этот код более быстрым с точки зрения выполнения:Date.prototype.toJSONLocal = function() { var local = new Date(this); local.setHours( this.getHours()+(this.getTimezoneOffset()/-60) ); return local.toJSON().slice(0, 10); } simo
Поскольку смещение часового пояса возвращается в минутах, вы можете использовать несколько проще и корочеlocal.setMinutes(this.getMinutes() - this.getTimezoneOffset());, Также обратите внимание, что часовые пояса не являются четными часами (некоторые 15 минутами), использование минут сохраняет все как целые числа. Что касается производительности, вам нужно тестировать в разных браузерах. Но я подозреваю, что если вы не называете это тысячи раз, скорость не имеет значения.
Да, если вам нужно поддерживать IE6 или IE7, вам нужно включить поддержку .toJSON ().JScript 5.8 support, IE8 includes JScript 5.8
Да, и одна из причин не использовать toJSON состоит в том, что это метод ES5, поэтому он не поддерживается старыми браузерами, тогда как поддержка ECMA-262 ed 3 повсеместна.

Похожие вопросы