Ошибка разницы в дате Javascript?

Изменить: это не ошибка, как указал Мартин. Я просто перехожу на летнее время, отсюда и разница в 1 час.

Я хочу рассчитать разницу в днях между «29 марта 2010 г.» и «09 марта 2010 г.», поэтому у меня есть следующий код:

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

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

20.958333333333332

Разница между этими двумя датами неверна. Предполагается, что это 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 на Windows 7. Другие браузеры не пробовал.

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


person disc0dancer    schedule 05.03.2010    source источник
comment
Ваша вторая дата 08 марта 2010.   -  person SLaks    schedule 05.03.2010


Ответы (3)


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

person Martin    schedule 05.03.2010
comment
Да, вы правы :) Я добавил к разнице дат 3 600 000 и деление получилось правильно. Глупо с моей стороны упустить это из виду. - person disc0dancer; 05.03.2010
comment
В этом году летнее время в США наступает 14 марта. Он входит в оба диапазона, не так ли? - person Eric Bréchemier; 05.03.2010
comment
Я в Македонии, поэтому на моей машине все по-другому. - person disc0dancer; 05.03.2010
comment
Летнее время должно быть 28 марта в 1:00 в Македонии... Тогда это имеет смысл. - person Eric Bréchemier; 05.03.2010

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

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

person Jay    schedule 05.03.2010

(Я вижу, вы уловили изменение летнего времени)

Любое подразделение javascript может иметь проблемы с плавающей запятой - установите необходимую вам «точность».

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

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

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

person kennebec    schedule 05.03.2010
comment
Я также мог бы использовать Math.round() для результата, поскольку разницы в 1 час никогда не будет достаточно, чтобы дать вам ошибки при округлении. Интересно, какой из них быстрее? - person disc0dancer; 05.03.2010