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

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

Ответ 1

Используя объект 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.

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

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

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

Ответ 2

Используйте DateJs.

Швейцарский нож для программирования даты и времени javascript!

http://www.datejs.com/

Ответ 3

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

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

К сожалению, вычисление интервала дат, например дней, недель или месяцев между двумя известными датами, не так просто, потому что вы не можете просто добавлять объекты Date вместе. Чтобы использовать объект Date при любом вычислении, мы должны сначала получить значение даты в миллисекундах, которое хранится как большое целое число. Функция для этого - Date.getTime(). После преобразования обоих дат вычитание более позднего из предыдущего возвращает разницу в миллисекундах. Затем желаемый интервал можно определить, разделив это число на соответствующее количество миллисекунд. Например, чтобы получить количество дней для заданного количества миллисекунд, мы разделим на 86 400 000, количество миллисекунд в день (1000 х 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));

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

Ссылка

Ответ 4

    // This is for first date
    first = new Date(2010, 03, 08, 15, 30, 10); // Get the first date epoch object
    document.write((first.getTime())/1000); // get the actual epoch values
    second = new Date(2012, 03, 08, 15, 30, 10); // Get the first date epoch object
    document.write((second.getTime())/1000); // get the actual epoch values
    diff= second - first ;
    one_day_epoch = 24*60*60 ;  // calculating one epoch
    if ( diff/ one_day_epoch > 365 ) // check , is it exceei
    {
    alert( 'date is exceeding one year');
    }

Ответ 5

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

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 month, 
        //   plus days that have passed in date2 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)));

Ответ 6

Этот ответ, основанный на другом ответе (ссылка в конце), касается разницы между двумя датами.
Вы можете увидеть, как это работает, потому что это просто, а также включает в себя разделение разницы в
единицы времени (функция, которую я сделал) и преобразование в 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)] );} ));

Ответ 7

Date.prototype.addDays = function(days) {

   var dat = new Date(this.valueOf())
   dat.setDate(dat.getDate() + days);
   return dat;
}

function getDates(startDate, stopDate) {

  var dateArray = new Array();
  var currentDate = startDate;
  while (currentDate <= stopDate) {
    dateArray.push(currentDate);
    currentDate = currentDate.addDays(1);
  }
  return dateArray;
}

var dateArray = getDates(new Date(), (new Date().addDays(7)));

for (i = 0; i < dateArray.length; i ++ ) {
  //  alert (dateArray[i]);

    date=('0'+dateArray[i].getDate()).slice(-2);
    month=('0' +(dateArray[i].getMonth()+1)).slice(-2);
    year=dateArray[i].getFullYear();
    alert(date+"-"+month+"-"+year );
}

Ответ 8

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 ('mm', новая дата ('2015-05-05'), новая дата());

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

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

ИЛИ

     

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

     

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

     

var qtMonths = DateDiff ('months', новая дата ('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;

}