2016-04-01 3 views
0

Почему у меня есть 2 разных даты с new Date(), когда я передаю дату, когда я передаю дату и время?Javascript Date() разница между датой и датой даты

пример:

Date.parse('2015-03-14') 
 
// 1426291200000 
 
new Date(1426291200000) 
 
// Fri Mar 13 2015 17:00:00 GMT-0700 (PDT) 
 

 
Date.parse('2015-03-14 00:00:00') 
 
// 1426316400000 
 
new Date(1426291400000) 
 
// Fri Mar 13 2015 17:03:20 GMT-0700 (PDT)

+0

'new Date (1426291400000)' не дает результата, как вы показали. – Rayon

+0

@RayonDabre Вы в Индии .. Я в Калифорнии, США ...Вы имеете в виду, что результаты отличаются от разных часовых поясов? –

+0

https://jsfiddle.net/zpzswmqr/ – Rayon

ответ

3

Извините, но я еще не могу комментировать. string вы передаете Date.parse() должны следовать

ECMAScript 5 ISO-8601 Поддержка формата .Reference ссылка here

format specified in ECMAScript 2015

В соответствии с этим, вы формат даты с время должно быть: '2015-03-14T00:00:00' вместо '2015-03-14 00:00:00'.

И поскольку время Date.parse('2015-03-14') находится на GMT + 00, но Date.parse('2015-03-14T00:00:00') в вашем часовом поясе, так что если вы добавите часовой пояс GMT + 00 на второй два времени будет равна:

Date.parse('2015-03-14'); 
Date.parse('2015-03-14T00:00:00+00:00'); 
//1426291200000 
+0

Обратите внимание, что [* ECMAScript 2015 *] (http://www.ecma-international.org/ecma-262/6.0/#sec-date-time-string-format) говорит: * Если смещение часового пояса отсутствует, дата-время интерпретируется как локальное время *, которое соответствует стандарту ISO 8601 и интерпретируется как применяемое только к форматам даты. Однако [* TC39 *] (https://github.com/tc39/ecma262/issues/87) в своей мудрости решили, что дата и время без часового пояса должны быть локальными, но дата должна быть только UTC (вопреки стандарт, который они пытались поддержать). – RobG

1

Почему Я получаю две разные даты с новой Date(), когда я передаю дату или когда я передаю дату и время?

Поскольку разбор строки с датой конструктора (и Date.parse, они эквивалентны) во многом зависит от реализации, и поэтому настоятельно рекомендуется против.

Date.parse('2015-03-14') 
// 1426291200000 
new Date(1426291200000) 
// Fri Mar 13 2015 17:00:00 GMT-0700 (PDT) 

ISO 8601 даты в формате, рассматриваются как UTC в браузерах, совместимых с ES5 и более поздних (и UTC, местных или недействительных предыдущими реализациями), однако не все браузеры совместимы. Кроме того, указанное поведение несовместимо с ISO 8601, в котором указано, что даты без часового пояса должны рассматриваться как локальные.

Date.parse('2015-03-14 00:00:00') 
// 1426316400000 
new Date(1426291400000) 
// Fri Mar 13 2015 17:03:20 GMT-0700 (PDT) 

Строка «2015-03-14 00:00:00» не соответствует ISO 8601, поэтому разбор полностью зависит от реализации и может рассматриваться как UTC, локальный или недействительным. Если сделано совместимым с добавлением «Т»:

"2015-03-14T00:00:00" 

он должен рассматриваться как местные (отмечая ранее упомянутое предостережение о несоответствующих реализации).

Настоятельно рекомендуется всегда вручную разбирать строки. Используйте библиотеку, один из многих хороших парсеров, которые находятся вокруг или просто пишут вашу собственную функцию, достаточно 2 или 3 строки.

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