Как я получаю количество дней между двумя датами в JavaScript?

Как я получаю количество дней между двумя датами в JavaScript? Например, учитывая две даты в полях ввода:

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

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>
383
задан Michael Haren 14 May 2013 в 07:13
поделиться

4 ответа

Вот быстр и грязен реализация datediff как подтверждение концепции для решения проблемы, как представлено в вопросе. Это полагается на то, что можно получить прошедшие миллисекунды между двумя датами путем вычитания их, который принуждает их в их примитивное числовое значение (миллисекунды начиная с запуска 1970).

// new Date("dateString") is browser-dependent and discouraged, so we'll write
// a simple parse function for U.S. date format (which does no error checking)
function parseDate(str) {
    var mdy = str.split('/');
    return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

function datediff(first, second) {
    // Take the difference between the dates and divide by milliseconds per day.
    // Round to nearest whole number to deal with DST.
    return Math.round((second-first)/(1000*60*60*24));
}

alert(datediff(parseDate(first.value), parseDate(second.value)));
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

необходимо знать, что "нормальные" API Даты (без "UTC" на имя) работают в локальном часовом поясе браузера пользователя, так в целом Вы могли столкнуться с проблемами, если Ваш пользователь находится в часовом поясе, который Вы не ожидаете, и Ваш код должен будет иметь дело с переходами Летнего времени. Необходимо тщательно прочитать документацию для объекта Даты и его методы, и для чего-либо более сложного, сильно рассмотреть использование библиотеки, которая предлагает более безопасные и мощные API для управления датой.

кроме того, в целях иллюстрации, использование отрывка названный доступом на window объект для краткости, но в производстве необходимо использовать стандартизированные API как getElementById, или более вероятно, некоторая платформа UI.

390
ответ дан Miles 22 November 2019 в 23:53
поделиться

Я шел бы вперед и захват эта маленькая утилита , и в нем Вы найдете функции к этому для Вас. Вот короткий пример:

        <script type="text/javascript" src="date.js"></script>
        <script type="text/javascript">
            var minutes = 1000*60;
            var hours = minutes*60;
            var days = hours*24;

            var foo_date1 = getDateFromFormat("02/10/2009", "M/d/y");
            var foo_date2 = getDateFromFormat("02/12/2009", "M/d/y");

            var diff_date = Math.round((foo_date2 - foo_date1)/days);
            alert("Diff date is: " + diff_date );
        </script>
40
ответ дан fuentesjr 22 November 2019 в 23:53
поделиться

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

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

Вы получаете дни различия (или NaN, если один или оба не могли бы быть проанализированы). Дата синтаксического анализа дала результат в миллисекундах, и получить его днем у Вас есть к разделенному он 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        )
    };
}

Вот моя пересмотренная версия версии James:

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;
    }
}
113
ответ дан some 22 November 2019 в 23:53
поделиться

Что относительно того, чтобы использовать formatDate от виджета DatePicker? Вы могли использовать его, чтобы преобразовать даты в формате метки времени (миллисекунды с 01.01.1970) и затем сделать простое вычитание.

5
ответ дан kgiannakakis 22 November 2019 в 23:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: