Разница между датами в JavaScript

Как найти разницу между двумя датами?


person Saranya    schedule 28.12.2009    source источник
comment
Возможный дубликат Сравните две даты с помощью JavaScript   -  person    schedule 02.08.2017


Ответы (6)


Используя объект Date и его значение в миллисекундах, можно рассчитать разницу:

var a = new Date(); // Current date now.
var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010.
var d = (b-a); // Difference in milliseconds.

Вы можете получить количество секунд (как целое/целое число), разделив миллисекунды на 1000, чтобы преобразовать его в секунды, а затем преобразовать результат в целое число (это удаляет дробную часть, представляющую миллисекунды):

var seconds = parseInt((b-a)/1000);

Затем вы можете получить целое minutes, разделив seconds на 60 и преобразовав его в целое число, затем hours, разделив minutes на 60 и преобразовав его в целое число, затем таким же образом более длинные единицы времени. Исходя из этого, можно создать функцию для получения максимальной полной суммы единицы времени в значении более низкой единицы и оставшейся более низкой единицы:

function get_whole_values(base_value, time_fractions) {
    time_data = [base_value];
    for (i = 0; i < time_fractions.length; i++) {
        time_data.push(parseInt(time_data[i]/time_fractions[i]));
        time_data[i] = time_data[i] % time_fractions[i];
    }; return time_data;
};
// Input parameters below: base value of 72000 milliseconds, time fractions are
// 1000 (amount of milliseconds in a second) and 60 (amount of seconds in a minute). 
console.log(get_whole_values(72000, [1000, 60]));
// -> [0,12,1] # 0 whole milliseconds, 12 whole seconds, 1 whole minute.

Если вам интересно, какие входные параметры указаны выше для второго объекта Date, см. их имена ниже:

new Date(<year>, <month>, <day>, <hours>, <minutes>, <seconds>, <milliseconds>);

Как отмечено в комментариях к этому решению, вам не обязательно указывать все эти значения, если только они не необходимы для даты, которую вы хотите представить.

person Sampson    schedule 28.12.2009
comment
Вам не нужно вызывать конструктор Date со всеми аргументами, вы можете вызывать его только с годом и месяцем, остальные аргументы необязательны. - person Christian C. Salvadó; 28.12.2009
comment
Спасибо, КМС. Я хотел убедиться, что пользователь понимает, что его спецификация может быть очень детальной. - person Sampson; 28.12.2009
comment
Я обновил решение, чтобы сообщить о вашей точке зрения, CMS. Я ценю хедз-ап. - person Sampson; 28.12.2009
comment
Добро пожаловать, Джонатан, спасибо за редактирование... также обратите внимание, что b на самом деле 2009-12-31, поскольку 0 использовалось в качестве аргумента дня, это может как-то сбить с толку новичка... - person Christian C. Salvadó; 28.12.2009
comment
Ах, хороший глаз, CMS. Месяц нулевой, если не ошибаюсь. Действительно немного запутанно. - person Sampson; 28.12.2009
comment
@Edward Спасибо за предложение (я); одобренный. - person Sampson; 03.09.2016
comment
Теперь я добавил этот полезный ответ на более популярный вопрос по адресу stackoverflow.com/a/46529159/3787376. Он ссылается на этот исходный ответ и включает мою функцию для разделения разницы во времени на единицы, которая сработала хорошо, поэтому я хотел поделиться ею с ответом. - person Edward; 02.10.2017
comment
Кроме того, на основе этого есть обновленный ответ на stackoverflow.com/a/53092438/3787376. - person Edward; 01.11.2018

Я нашел это, и это отлично работает для меня:

Вычисление разницы между двумя известными датами

К сожалению, вычисление интервала дат, такого как дни, недели или месяцы, между двумя известными датами не так просто, потому что вы не можете просто сложить объекты Date вместе. Чтобы использовать объект Date в любом виде вычислений, мы должны сначала получить внутреннее значение Date в миллисекундах, которое хранится в виде большого целого числа. Для этого используется функция Date.getTime(). После преобразования обеих дат вычитание более поздней из более ранней возвращает разницу в миллисекундах. Затем можно определить желаемый интервал, разделив это число на соответствующее количество миллисекунд. Например, чтобы получить количество дней для заданного количества миллисекунд, мы должны разделить на 86 400 000 количество миллисекунд в сутках (1000 x 60 секунд x 60 минут x 24 часа):

Date.daysBetween = function( date1, date2 ) {
  //Get 1 day in milliseconds
  var one_day=1000*60*60*24;

  // Convert both dates to milliseconds
  var date1_ms = date1.getTime();
  var date2_ms = date2.getTime();

  // Calculate the difference in milliseconds
  var difference_ms = date2_ms - date1_ms;

  // Convert back to days and return
  return Math.round(difference_ms/one_day); 
}

//Set the two dates
var y2k  = new Date(2000, 0, 1); 
var Jan1st2010 = new Date(y2k.getFullYear() + 10, y2k.getMonth(), y2k.getDate());
var today= new Date();
//displays 726
console.log( 'Days since ' 
           + Jan1st2010.toLocaleDateString() + ': ' 
           + Date.daysBetween(Jan1st2010, today));

Округление не является обязательным, в зависимости от того, хотите ли вы неполные дни или нет.

Справочник

person Adrian P.    schedule 23.09.2013

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

function interval(date1, date2) {
    if (date1 > date2) { // swap
        var result = interval(date2, date1);
        result.years  = -result.years;
        result.months = -result.months;
        result.days   = -result.days;
        result.hours  = -result.hours;
        return result;
    }
    result = {
        years:  date2.getYear()  - date1.getYear(),
        months: date2.getMonth() - date1.getMonth(),
        days:   date2.getDate()  - date1.getDate(),
        hours:  date2.getHours() - date1.getHours()
    };
    if (result.hours < 0) {
        result.days--;
        result.hours += 24;
    }
    if (result.days < 0) {
        result.months--;
        // days = days left in date1's month, 
        //   plus days that have passed in date2's month
        var copy1 = new Date(date1.getTime());
        copy1.setDate(32);
        result.days = 32-date1.getDate()-copy1.getDate()+date2.getDate();
    }
    if (result.months < 0) {
        result.years--;
        result.months+=12;
    }
    return result;
}

// Be aware that the month argument is zero-based (January = 0)
var date1 = new Date(2015, 4-1, 6);
var date2 = new Date(2015, 5-1, 9);

document.write(JSON.stringify(interval(date1, date2)));

Это решение будет обрабатывать високосные годы (29 февраля) и разницу в длине месяцев так, как мы это сделали бы естественным образом (я думаю).

Так, например, интервал между 28 февраля 2015 года и 28 марта 2015 года будет считаться ровно одним месяцем, а не 28 днями. Если оба эти дня приходятся на 2016 год, разница все равно будет ровно в один месяц, а не в 29 дней.

Даты с одним и тем же месяцем и днем, но с разным годом всегда будут иметь разницу в точное количество лет. Таким образом, разница между 01.03.2015 и 01.03.2016 будет ровно 1 год, а не 1 год и 1 день (из-за того, что 365 дней считаются за 1 год).

person trincot    schedule 12.05.2016

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

function date_units_diff(a, b, unit_amounts) {
    var split_to_whole_units = function (milliseconds, unit_amounts) {
        // unit_amounts = list/array of amounts of milliseconds in a
        // second, seconds in a minute, etc., for example "[1000, 60]".
        time_data = [milliseconds];
        for (i = 0; i < unit_amounts.length; i++) {
            time_data.push(parseInt(time_data[i] / unit_amounts[i]));
            time_data[i] = time_data[i] % unit_amounts[i];
        }; return time_data.reverse();
    }; if (unit_amounts == undefined) {
        unit_amounts = [1000, 60, 60, 24];
    };
    var utc_a = new Date(a.toUTCString());
    var utc_b = new Date(b.toUTCString());
    var diff = (utc_b - utc_a);
    return split_to_whole_units(diff, unit_amounts);
}

// Example of use:
var d = date_units_diff(new Date(2010, 0, 1, 0, 0, 0, 0), new Date()).slice(0,-2);
document.write("In difference: 0 days, 1 hours, 2 minutes.".replace(
   /0|1|2/g, function (x) {return String( d[Number(x)] );} ));

Как работает мой код выше

Разницу между датой и временем в миллисекундах можно рассчитать с помощью объекта Date:

var a = new Date(); // Current date now.
var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010.

var utc_a = new Date(a.toUTCString());
var utc_b = new Date(b.toUTCString());
var diff = (utc_b - utc_a); // The difference as milliseconds.

Затем, чтобы вычислить количество секунд в этой разнице, разделите его на 1000, чтобы преобразовать
миллисекунды в секунды, а затем измените результат на целое число (целое число), чтобы удалить
миллисекунды (дробная часть этого десятичного числа). : var seconds = parseInt(diff/1000).
Кроме того, я мог бы получить более длинные единицы времени, используя тот же процесс, например:
- (целые) минуты, разделив секунды на 60. и изменить результат на целое число,
- часы, разделить минуты на 60 и изменить результат на целое число.

Я создал функцию для выполнения этого процесса разбиения разницы на целые
единицы времени, названную split_to_whole_units, с помощью этой демонстрации:

console.log(split_to_whole_units(72000, [1000, 60]));
// -> [1,12,0] # 1 (whole) minute, 12 seconds, 0 milliseconds.

Этот ответ основан на этом другом.

person Edward    schedule 31.10.2018
comment
Примечание. Другой (копия этого) пост находится по адресу stackoverflow.com/questions/542938/. - person Edward; 04.11.2018

Вы также можете использовать его

export function diffDateAndToString(small: Date, big: Date) {


    // To calculate the time difference of two dates 
    const Difference_In_Time = big.getTime() - small.getTime()

    // To calculate the no. of days between two dates 
    const Days = Difference_In_Time / (1000 * 3600 * 24)
    const Mins = Difference_In_Time / (60 * 1000)
    const Hours = Mins / 60

    const diffDate = new Date(Difference_In_Time)

    console.log({ date: small, now: big, diffDate, Difference_In_Days: Days, Difference_In_Mins: Mins, Difference_In_Hours: Hours })

    var result = ''

    if (Mins < 60) {
        result = Mins + 'm'
    } else if (Hours < 24) result = diffDate.getMinutes() + 'h'
    else result = Days + 'd'
    return { result, Days, Mins, Hours }
}

результаты в {результат: '30d', дней: 30, минут: 43200, часов: 720}

person Chetan Jain    schedule 29.06.2020

var DateDiff = function(type, start, end) {

    let // or var
        years = end.getFullYear() - start.getFullYear(),
        monthsStart = start.getMonth(),
        monthsEnd = end.getMonth()
    ;

    var returns = -1;

    switch(type){
        case 'm': case 'mm': case 'month': case 'months':
            returns = ( ( ( years * 12 ) - ( 12 - monthsEnd ) ) + ( 12 - monthsStart ) );
            break;
        case 'y': case 'yy': case 'year': case 'years':
            returns = years;
            break;
        case 'd': case 'dd': case 'day': case 'days':
            returns = ( ( end - start ) / ( 1000 * 60 * 60 * 24 ) );
            break;
    }

    return returns;

}

использование

var qtMonths = DateDiff('мм', новая дата('2015-05-05'), новая дата());

var qtYears = DateDiff('yy', новая дата('2015-05-05'), новая дата());

var qtDays = DateDiff('dd', новая дата('2015-05-05'), новая дата());

OR

var qtMonths = DateDiff('m', новая дата('2015-05-05'), новая дата()); // м || у || г

var qtMonths = DateDiff('месяц', новая дата('2015-05-05'), новая дата()); // месяц || год || день

var qtMonths = DateDiff('месяцы', новая дата('2015-05-05'), новая дата()); // месяцы || лет || дни

...

var DateDiff = function (type, start, end) {

    let // or var
        years = end.getFullYear() - start.getFullYear(),
        monthsStart = start.getMonth(),
        monthsEnd = end.getMonth()
    ;

    if(['m', 'mm', 'month', 'months'].includes(type)/*ES6*/)
        return ( ( ( years * 12 ) - ( 12 - monthsEnd ) ) + ( 12 - monthsStart ) );
    else if(['y', 'yy', 'year', 'years'].includes(type))
        return years;
    else if (['d', 'dd', 'day', 'days'].indexOf(type) !== -1/*EARLIER JAVASCRIPT VERSIONS*/)
        return ( ( end - start ) / ( 1000 * 60 * 60 * 24 ) );
    else
        return -1;

}
person user3245067    schedule 06.12.2017