Вычитание даты в JavaScript

У меня есть два текстовых поля, которые принимают Start Date а также End Date соответственно в формате ГГГГ / ММ / ДД.

Мне нужно предупредить пользователя, если он выберет дату окончания, которая превышает дату начала на 50 дней.

Вот что у меня так далеко:

var startDate = new Date(document.getElementsByName('MYSTARTDATE').value);
var endDate = new Date(document.getElementsByName('MYENDDATE').value);
if ((endDate - startDate) > 50) 
{
    alert('End date exceeds specification');
    return false;
}

Просто в качестве примера, когда я выбираю дату начала как 2012/01/22 и дата окончания как 2012/02/29

startDate = 'Sun Jan 22 00:00:00 UTC +0530 2012'
endDate = 'Wed Feb 29 00:00:00 UTC +0530 2012'

И результат для endDate - startDate является 3283200000, вместо 38.Что я делаю неправильно?

2 ответа

Решение

3283200000 - это 38 дней в миллисекундах.

38 дней x 24 часа x 60 минут x 60 секунд x 1000 миллисекунд

Кроме того, между этими двумя датами 38 дней, а не 39.

Простое решение состоит в том, чтобы иметь переменную (действительно постоянную), определенную как количество миллисекунд в дне:

var days = 24*60*60*1000;

И используйте эту переменную в качестве "единицы" в вашем сравнении:

if ((endDate - startDate) > 50*days) { 
     ...
}

Решение от Jeff B неверно из-за перехода на летнее время. Если начальная дата, скажем, 31 октября, а конечная дата - 20 декабря, период времени, фактически прошедший между этими двумя значениями времени, составляет 50 дней плюс 1 час, а не 50 дней. Это особенно плохо, если ваша программа не заботится о времени суток и устанавливает все время в полночь - в этом случае все вычисления будут отключены на один за всю зиму.

Частью правильного способа вычитания дат является создание нового объекта Date для каждого из времен, а затем использование массива с числом дней в каждом месяце для вычисления того, сколько дней фактически прошло.

Но что еще хуже, даты, когда Европа меняет часы, отличаются от дат, когда часы меняются в Нью-Йорке. Следовательно, одного часового пояса недостаточно, чтобы определить, сколько дней прошло; местоположение также необходимо.

Переход на летнее время значительно усложняет обработку данных. На моем веб-сайте функция, необходимая для точного вычисления количества пройденных дней, составляет почти сто строк. Фактическая сложность зависит от того, являются ли вычисления на стороне клиента или на стороне сервера, или на обоих, и на том, кто просматривает данные.

Другие вопросы по тегам