Вопрос

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

Это было полезно?

Решение

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

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>);

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

Другие советы

Я нашел это, и у меня это прекрасно работает:

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

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

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

Ссылка

    // 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');
    }

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

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 дней.

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

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

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

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

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, чтобы преобразовать
от миллисекунд до секунд, затем измените результат на целое число (integer number), чтобы удалить
миллисекунды (дробная часть этой десятичной дроби): 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.

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

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

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

или

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;

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top