web-dev-qa-db-ja.com

JavaScriptの日付の違い

2つの日付の違いを見つける方法は?

61
Saranya

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を60で除算して整数に変換し、secondsを60で除算してhoursを整数に変換することにより、minutes全体を取得できます。整数、同じ方法でより長い時間単位。これから、下位単位と残りの下位単位の値で、時間単位の最大全体量を取得する関数を作成できます。

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.

2番目の Dateオブジェクト に対して上記で提供された入力パラメーターが何であるか疑問に思っている場合は、以下の名前を参照してください。

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

このソリューションのコメントで述べたように、表現したい日付に必要な場合を除き、これらの値をすべて提供する必要はありません。

98
Sampson

私はこれを見つけましたが、私にとってはうまくいきます:

2つの既知の日付の差を計算する

残念ながら、2つの既知の日付間の日、週、または月などの日付間隔を計算するのは、Dateオブジェクトを一緒に追加することはできないため、それほど簡単ではありません。あらゆる種類の計算でDateオブジェクトを使用するには、最初に大きな整数として格納されているDateの内部ミリ秒値を取得する必要があります。それを行う関数はDate.getTime()です。両方の日付が変換されると、前の日付から後の日付を引くと、ミリ秒単位の差が返されます。次に、その数を対応するミリ秒数で除算することにより、目的の間隔を決定できます。たとえば、指定されたミリ秒数の日数を取得するには、1日のミリ秒数である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));

四捨五入は、部分的な日が必要かどうかに応じてオプションです。

参照

4
Adrian P.
    // 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');
    }
3
Pavunkumar

別の回答(最後のリンク)に基づくこの回答は、2つの日付の違いに関するものです。
シンプルであるため、どのように機能するかを見ることができます。また、違いを
時間単位(私が作成した関数)および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)
また、同じプロセスを使用して、より長い時間単位を取得することもできます。例:
全体)minutessecondsで割る60および結果を整数に変更し、
-hoursminutesを60で割って変更結果を整数に変換します。

違いを分割するプロセスを行う関数を作成しました
_split_to_whole_units_という名前の時間単位全体。このデモでは:

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

この回答は、---(このもう1つに基づいています

1
Edward

年、月、日の組み合わせとして表現される違いを探しているなら、私はこの機能を提案します:

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

この解決策は、うるう年(2月29日)と月の長さの違いを自然に処理する方法で処理します(私は思う)。

したがって、たとえば、2015年2月28日から2015年3月28日までの間隔は、28日間ではなく、正確に1か月と見なされます。これらの日が両方とも2016年である場合、差は29日ではなくちょうど1か月になります。

月と日がまったく同じで、年が異なる日付は、常に正確な年数の違いがあります。したがって、2015-03-01と2016-03-01の差は、1年と1日ではなく、正確に1年になります(365日を1年としてカウントするため)。

1
trincot
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 );
}
0
user3230982
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'、new Date( '2015-05-05')、new Date());

var qtYears = DateDiff( 'yy'、new Date( '2015-05-05')、new Date());

var qtDays = DateDiff( 'dd'、new Date( '2015-05-05')、new Date());

OR

var qtMonths = DateDiff( 'm'、new Date( '2015-05-05')、new Date()); // m || y || d

var qtMonths = DateDiff( 'month'、new Date( '2015-05-05')、new Date()); //月||年||日

var qtMonths = DateDiff( 'months'、new Date( '2015-05-05')、new Date()); //ヶ月||年||日々

...

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;

}
0
user3245067