Ошибка различия в Дате JavaScript?

Править: Это не ошибка, как указал Martin. Я просто пересекаю летнее время, следовательно различие 1 ч.

Я хочу вычислить различие в днях между "29 марта 2010" и "09 марта 2010" таким образом, у меня есть следующий код:

((new Date(2010, 2, 29)).getTime() - (new Date(2010, 2, 8)).getTime()) / 86400000

86400000 количество миллисекунд за день, и различие между датами возвращается в миллисекундах, таким образом, это должно работать. Только это не делает вполне. Я добираюсь

20.958333333333332

Вот в чем разница между теми 2 датами, которое неправильно. Это, как предполагается, 1814400000 (21 день 86400000), но это на самом деле 1810800000.

Кроме того, если я изменяю различие на:

((new Date(2010, 2, 28)).getTime() - (new Date(2010, 2, 7)).getTime()) / 86400000

то же различие, только смещенное однажды назад, я получаю нормальные результаты.

Это происходит, только если мы пытаемся добраться (x-y), где x после 29 марта 2010, и y до 29 марта 2010.

Я получаю это на Safari 4 и Firefox 3.6 на Mac, а также IE 8 на окнах 7. Не попробовали другие браузеры.

Я делаю что-то не так, или действительно ли это - известная ошибка?

8
задан disc0dancer 5 March 2010 в 14:14
поделиться

3 ответа

Вы пересекаете границу перехода на летнее время, поэтому разница в 1 час.

11
ответ дан 5 December 2019 в 11:24
поделиться

Переход на летнее время делает арифметику даты сложной задачей. Это означает, что, хотя 363 дня в году составляют 24 часа, один день - это 25 часов, а один день - всего 23 часа. Лично я голосую за отмену летнего времени.

В Java есть класс GregorianCalendar, который правильно выполняет арифметические операции с датой, несмотря на летнее время. Я думаю, это не очень помогает в Javascript.

2
ответ дан 5 December 2019 в 11:24
поделиться

(Я вижу, вы уловили изменение dst)

Любое деление javascript может иметь проблемы с плавающей точкой - установите "точность", которая вам нужна.

Вам не нужно получать время самостоятельно - javascript сделает преобразование за вас.

+((new Date(2010, 2, 29) - new Date(2010, 2, 8))/ 86400000).toFixed(2)

/* возвращаемое значение: (Число) 20.96 (местное время. которое может быть тем, что вам нужно - в противном случае, установите части даты UTC) */

2
ответ дан 5 December 2019 в 11:24
поделиться
Другие вопросы по тегам:

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