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

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

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

Ответы на вопрос(2)

Решение Вопроса

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

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

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

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

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"
 08 июл. 2012 г., 13:56
Вы можете получить только год / месяц / день в часовом поясе клиента и / или в UTC. Во всех других часовых поясах вам нужно конвертировать вручную (форма UTC) или анализировать дату в php с учетом часового пояса, который он содержит.
 simo08 июл. 2012 г., 13:27
Хорошо, но я хочу, чтобы мое свидание вYYYY-MM-DD форматировать как можно проще. КакиеtoJSON возврат по умолчанию не работает для меня.
 08 июл. 2012 г., 14:11
toJSON не преобразует местное время в Zulu. Объекты Date всегда находятся в формате UTC, при представлении дат в удобочитаемой для человека форме они считают смещение местного часового пояса показом местного времени.

Ваш ответ на вопрос