Вычитание даты в JavaScript - PullRequest
       12

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

5 голосов
/ 29 февраля 2012

У меня есть два текстовых поля, которые принимают 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 ]

9 голосов
/ 29 февраля 2012

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

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

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

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

var days = 24*60*60*1000;

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

if ((endDate - startDate) > 50*days) { 
     ...
}
0 голосов
/ 19 ноября 2013

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

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

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

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

...