5

Как вычислить количество дней между двумя датами?

14

Описание проблемы:

Я работаю с JavaScript и у меня есть две даты, которые я получаю из полей ввода:

<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // что здесь должно быть?
</script>

Мне нужно вычислить количество дней между этими двумя датами. Я не уверен, как правильно передать даты в функцию datediff, и, в целом, не знаю, как правильно реализовать расчёт разности между двумя датами в JavaScript.

Каковы правильные шаги, чтобы получить это значение? Буду признателен за подсказку или пример решения!

5 ответ(ов)

2

На момент написания, только один из других ответов корректно обрабатывает переходы на летнее время (DST). Вот результаты на системе, расположенной в Калифорнии:

                                        1/1/2013- 3/10/2013- 11/3/2013-
Пользователь  Формула                   2/1/2013  3/11/2013  11/4/2013  Результат
------------  ------------------------  --------  ---------  ---------  ---------
Miles                   (d2 - d1) / N   31        0.9583333  1.0416666  Некорректно
some         Math.floor((d2 - d1) / N)  31        0          1          Некорректно
fuentesjr    Math.round((d2 - d1) / N)  31        1          1          Корректно
toloco     Math.ceiling((d2 - d1) / N)  31        1          2          Некорректно

N = 86400000

Хотя метод Math.round возвращает правильные результаты, я считаю его немного громоздким. Вместо этого, учитывая изменения в смещении UTC при начале или завершении DST, мы можем использовать точную арифметику:

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

alert(daysBetween($('#first').val(), $('#second').val()));

Объяснение

Расчеты дат в JavaScript сложны, потому что объекты Date хранят время в UTC, а не в местном времени. Например, 3/10/2013 12:00 AM по тихоокеанскому стандартному времени (UTC-08:00) хранится как 3/10/2013 8:00 AM UTC, а 3/11/2013 12:00 AM по тихоокеанскому летнему времени (UTC-07:00) хранится как 3/11/2013 7:00 AM UTC. В этот день с полуночи до полуночи в местном времени всего 23 часа в UTC!

Хотя день в местном времени может иметь больше или меньше 24 часов, день в UTC всегда точь-в-точь 24 часа.1 Метод daysBetween, показанный выше, использует этот факт, сначала вызывая treatAsUTC, чтобы привести оба местных времени к полуночи UTC, а затем вычитая и деля.

1. JavaScript игнорирует високосные секунды.

1

Самый простой способ получить разницу между двумя датами:

var diff = Math.floor((Date.parse(str2) - Date.parse(str1)) / 86400000);

В результате вы получите количество дней (или NaN, если одна из дат или обе не удалось распарсить). Функция Date.parse возвращает результат в миллисекундах, и для получения количества дней необходимо разделить на 24 * 60 * 60 * 1000.

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

function dateDiff( str1, str2 ) {
    var diff = Date.parse( str2 ) - Date.parse( str1 ); 
    return isNaN( diff ) ? NaN : {
        diff : diff,
        ms : Math.floor( diff            % 1000 ),
        s  : Math.floor( diff /     1000 %   60 ),
        m  : Math.floor( diff /    60000 %   60 ),
        h  : Math.floor( diff /  3600000 %   24 ),
        d  : Math.floor( diff / 86400000        )
    };
}

Вот моя доработанная версия:

function mydiff(date1, date2, interval) {
    var second = 1000, minute = second * 60, hour = minute * 60, day = hour * 24, week = day * 7;
    date1 = new Date(date1);
    date2 = new Date(date2);
    var timediff = date2 - date1;
    if (isNaN(timediff)) return NaN;
    switch (interval) {
        case "years": return date2.getFullYear() - date1.getFullYear();
        case "months": return (
            (date2.getFullYear() * 12 + date2.getMonth()) -
            (date1.getFullYear() * 12 + date1.getMonth())
        );
        case "weeks": return Math.floor(timediff / week);
        case "days": return Math.floor(timediff / day); 
        case "hours": return Math.floor(timediff / hour); 
        case "minutes": return Math.floor(timediff / minute);
        case "seconds": return Math.floor(timediff / second);
        default: return undefined;
    }
}

Эта функция позволяет получить разницу между двумя датами в заданном интервале (годы, месяцы, недели, дни, часы, минуты или секунды). Если даты не могут быть распознаны, функция вернет NaN.

1

Я рекомендую использовать библиотеку moment.js (http://momentjs.com/docs/#/displaying/difference/). Она корректно обрабатывает переход на летнее/зимнее время и в целом с ней приятно работать.

Пример:

var start = moment("2013-11-03");
var end = moment("2013-11-04");
end.diff(start, "days")

Результат: 1

0

Чтобы использовать Moment.js для вычисления разницы в днях между двумя датами, вы можете воспользоваться методом diff. Вот пример кода на JavaScript:

var future = moment('05/02/2015');
var start = moment('04/23/2015');
var d = future.diff(start, 'days'); // 9
console.log(d);

В этом примере мы создаем две даты: future и start, а затем используем diff, чтобы получить разницу между этими датами в днях. Результат будет равен 9, что означает, что между 23 апреля 2015 года и 2 мая 2015 года 9 дней.

Не забудьте подключить библиотеку Moment.js в вашем HTML-файле, чтобы код работал корректно:

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>

Если у вас остались вопросы или требуется дополнительная помощь, не стесняйтесь спрашивать!

0

Чтобы вычислить количество дней между двумя заданными датами, вы можете использовать следующий код. В этом примере я использую даты 1 января 2016 года и 31 декабря 2016 года:

var day_start = new Date("Jan 01 2016");
var day_end = new Date("Dec 31 2016");
var total_days = (day_end - day_start) / (1000 * 60 * 60 * 24);
document.getElementById("demo").innerHTML = Math.round(total_days);
<h3>КОЛИЧЕСТВО ДНЕЙ МЕЖДУ ЗАДАННЫМИ ДАТАМИ</h3>
<p id="demo"></p>

Этот код создает две даты и затем рассчитывает разницу между ними в миллисекундах, которая затем конвертируется в дни. Результат выводится в элементе с id "demo". Не забывайте, что для правильной работы кода вам нужно, чтобы соответствующий HTML-элемент находился на странице.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь