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



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

1018   6  

6 ответов:

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

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

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

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

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

к сожалению, вычисление интервала дат, такого как дни, недели или месяцы между двумя известными датами, не так просто, потому что вы не можете просто добавить объекты даты вместе. Чтобы использовать объект даты в любом виде вычисления, мы должны сначала получить внутреннее значение миллисекунды даты, которое хранится как большое целое число. Функция для этого это дата.метод 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));

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

ссылка

    // 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 февраля) и различия в длине месяца таким образом, как мы, естественно, будем делать (я думаю).

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

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;

}

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

ВАР qtMonths = функция datediff('мм', новая дата('2015-05-05'), новая дата());

ВАР qtYears = функция datediff('гг', новая дата('2015-05-05'), новая дата());

ВАР qtDays = функция datediff('ДД', новая дата('2015-05-05'), новая дата());

или

ВАР qtMonths = функция datediff('м', новая дата('2015-05-05'), новая дата()); // М || Г || Д

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

ВАР 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;

}

Comments

    Ничего не найдено.