Править: Это не ошибка, как указал 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. Не попробовали другие браузеры.
Я делаю что-то не так, или действительно ли это - известная ошибка?
Вы пересекаете границу перехода на летнее время, поэтому разница в 1 час.
Переход на летнее время делает арифметику даты сложной задачей. Это означает, что, хотя 363 дня в году составляют 24 часа, один день - это 25 часов, а один день - всего 23 часа. Лично я голосую за отмену летнего времени.
В Java есть класс GregorianCalendar, который правильно выполняет арифметические операции с датой, несмотря на летнее время. Я думаю, это не очень помогает в Javascript.
(Я вижу, вы уловили изменение dst)
Любое деление javascript может иметь проблемы с плавающей точкой - установите "точность", которая вам нужна.
Вам не нужно получать время самостоятельно - javascript сделает преобразование за вас.
+((new Date(2010, 2, 29) - new Date(2010, 2, 8))/ 86400000).toFixed(2)
/* возвращаемое значение: (Число) 20.96 (местное время. которое может быть тем, что вам нужно - в противном случае, установите части даты UTC) */