2010-03-05 3 views
8

Редактировать: Это не ошибка, как указал Мартин. Я просто перехожу на летнее время, отсюда разница в 1 час.Ошибка Javascript с ошибкой по дате?

Я хочу, чтобы вычислить разницу в днях между «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 

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

Это происходит только тогда, когда мы пытаемся получить (х), где х после 29 марта 2010 года, и у есть до 29 марта 2010 года

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

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

+1

Ваша вторая дата 8 марта 2010. – SLaks

ответ

11

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

+0

Да, ты прав :) Я добавил 3,600,000 к разнице дат, и деление получилось правильно. Глупый из меня, чтобы позволить этому промаху. – disc0dancer

+0

DST - 14 марта этого года в США. Он включен в оба диапазона, не так ли? –

+0

Я нахожусь в Македонии, поэтому на моей машине я думаю. – disc0dancer

2

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

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

2

(я вижу, вы поймали изменения Dst)

Любой Javascript подразделение несет ответственность иметь с плавающей точкой problems- установить «точность» вам нужно.

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

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

/* Возвращаемое значение: (номер) 20,96 (. По местному времени, которое может быть то, что вы want- в противном случае установите части даты UTC) */

+1

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

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