Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: disc0dancerОтветов: 3

Изменить: это не ошибка, как указал Мартин. Я просто перехожу на летнее время, отсюда и разница в 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. Другие браузеры не пробовал.

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

  • Ваша вторая дата 08 марта 2010. SLaks 05.03.2010

javascriptdate

Ответы

Ответ 1 · рейтинг 11 · Martin

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

Ответ 2 · рейтинг 2 · Jay

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

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

Ответ 3 · рейтинг 2 · kennebec

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы