2013-09-20 2 views
0

Я делаю манипуляции с датами в javascript, используя Date объект. Я потерял, как один час, чтобы понять ошибку: сразу после инициализации я использовал функцию .toJSON(), и моя дата уменьшилась на один. Вот пример кода, что я делаю:toJSON функция из объекта даты вычитания один день

var date = new Date(); 
console.log(date.getDate()); // print "19" 
date.setDate(date.getDate()-1); // print "18" 
var formated = date.toJSON().substr(0, 10); // print "2013-09-17" 

Внезапно дата перемещается от 18 до 17. Так быть уверен, что я попробовал это непосредственно в консоли разработчика:

new Date(2013, 09, 19) 
Sat Oct 19 2013 00:00:00 GMT+0200 (Paris, Madrid (heure d’été)) // date "19" as it should 
new Date(2013, 09, 19).toJSON() 
"2013-10-18T22:00:00.000Z" // date "18" as it shouldn't 

Теперь мой вопрос просто «почему?».

Возможно ли, что это произошло из моей конфигурации или еще?

Это ошибка? Если да, это известная ошибка?

ответ

4

Если посмотреть более внимательно:

new Date(2013, 09, 19); 
=> Sat Oct 19 2013 00:00:00 GMT+0200 (CEST) 

Две вещи важны здесь:

  1. час: 00:00:00
  2. часовому поясу,: +0200

Когда вы тогда звоните .toJSON, он преобразует его в GMT + 0.

So 00:00:00 - 2hr = Today -1, hour being 22:00:00.

Теперь посмотрим на:

new Date(2013, 09, 19).toJSON() 
=> "2013-10-18T22:00:00.000Z" 

Один день до этого, но час комплект для 22:00:00

Вот причина: переход от GMT+0200 к GMT+0.

Теперь для решения, кто-то уже спрашивал его: Javascript Date.toJSON don't get the timezone offset;)

+0

Thx Я должен иметь хотя бы об этом ... Я проверю – EoiFirst

+0

Спасибо. Я надеюсь, что ссылка на другой ответ поможет вам прибить решение;) –

+0

Мое решение было «Больше не использовать эту функцию». Но теперь я знаю \ o / – EoiFirst

0

Абсолютно никакой ошибки здесь, просто проверка часовой пояс.

0

Строка JSON находится в GMT (это то, что означает Z). Ваше местное время на два часа впереди. Таким образом, полночь 19-го в вашем часовом поясе 22:00 18-го числа в GMT.

0

Это из-за -2 часа времени офсетных. Попробуйте сделать

YourDate.setHours(0, -YourDate.getTimezoneOffset(), 0 0); 

Это будет правильная дата.

Смежные вопросы