JavaScriptで日付の違いを計算する方法は?


181

日、時間、分、秒、ミリ秒、ナノ秒で日付の差を計算したい。どうすればできますか?



1
以下のソリューションは、関係する2つの日付が異なるタイムゾーンにある場合、壊れます。より正確な解決策については、次の質問を参照してください。stackoverflow.com/ questions/ 3224834/…
Shyam Habarakada 2014年

回答:


219

2つのDateオブジェクトがあると仮定すると、それらを減算してミリ秒単位の差を取得できます。

var difference = date2 - date1;

そこから、単純な計算を使用して他の値を導出できます。


38
これが正解です。例:日数の違いを取得するにはMath.floor((date2 - date1) / (1000*60*60*24))-他の単位の違いについては、分母を調整します(基本値はmsです)。
trisweb 2013年

33
ミリ秒を年に変換するための「単純な」算術はありません。bissextileの年とタイムゾーンに注意する必要があります。日によっては23時間または25時間かかることがあります。一部の年は365,25日なので、ここには単純な算術はありません(まだ正確なソリューションを探しています)。
アレクサンドルサロメ

6
@Alexandre:この質問は何年も尋ねられたことがない。実際、年の違いを計算することは重要です。ただし、日付が同じタイムゾーンであると仮定すると、日数は正しくなります(不当ではない仮定)。私の知る限り、1日は24時間と定義されており、夏時間による「変動」は実際にはタイムゾーンの切り替えです。タイムゾーンをまだ区別していない場合、時差を把握しようとすると、特にDSTスイッチオーバーが時間を「繰り返す」ため、傷ついた世界に陥ります。ただし、1つのタイムゾーンにとどまれば、すべてが機能します。
icktoofay 2014年

12
@ trisweb—日数の違いを取得するような単純なものでさえ、コメントよりも複雑です。火曜日の午後10時から水曜日の午前9時までの日数は?あなたのアルゴリズムは0と言っています。他の人は1と考えるかもしれません
RobG、2015年

@RobG相対論者は、1以上または0未満と考えることさえあるかもしれません。すべては観測者に依存します。
イノセントバイスタンダー

78
var DateDiff = {

    inDays: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/(24*3600*1000));
    },

    inWeeks: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/(24*3600*1000*7));
    },

    inMonths: function(d1, d2) {
        var d1Y = d1.getFullYear();
        var d2Y = d2.getFullYear();
        var d1M = d1.getMonth();
        var d2M = d2.getMonth();

        return (d2M+12*d2Y)-(d1M+12*d1Y);
    },

    inYears: function(d1, d2) {
        return d2.getFullYear()-d1.getFullYear();
    }
}

var dString = "May, 20, 1984";

var d1 = new Date(dString);
var d2 = new Date();

document.write("<br />Number of <b>days</b> since "+dString+": "+DateDiff.inDays(d1, d2));
document.write("<br />Number of <b>weeks</b> since "+dString+": "+DateDiff.inWeeks(d1, d2));
document.write("<br />Number of <b>months</b> since "+dString+": "+DateDiff.inMonths(d1, d2));
document.write("<br />Number of <b>years</b> since "+dString+": "+DateDiff.inYears(d1, d2));

ここから抜粋したコードサンプル。


これは、単一のカウンターとして使用された場合、指定された形式で日付の違いのみを返します。たとえば、3か月、4日、5時間が必要な場合、これらの結果は生成されません。3か月、96日と多くの時間のライン。
Joris Kroos、2017年

30

別の解決策は、差分を新しいDateオブジェクトに変換し、その日付の年(1970年との差分)、月、日などを取得することです。

var date1 = new Date(2010, 6, 17);
var date2 = new Date(2013, 12, 18);
var diff = new Date(date2.getTime() - date1.getTime());
// diff is: Thu Jul 05 1973 04:00:00 GMT+0300 (EEST)

console.log(diff.getUTCFullYear() - 1970); // Gives difference as year
// 3

console.log(diff.getUTCMonth()); // Gives month count of difference
// 6

console.log(diff.getUTCDate() - 1); // Gives day count of difference
// 4

違いは「3年6ヶ月4日」のようなものです。人間が読める形式の違いを取り入れたい場合は、それが役立ちます。


意味じゃない!私たちは完全な違いを求めています!この例では、日数の差は4ではなく1281です。
chaim.dev 2014年

3
@ chaim.dev「人間が読める形式の違いを取り入れたい場合は、それが役立ちます。」
MuratÇorlu2015

7
これは信頼できません。さまざまな月の長さやうるう年などの異常を考慮に入れていません。
Marc Durdin、2015

2
Muratに感謝します。この解決策は私の問題を解決しました。私が本当に望んでいることphpと同じように動作する必要があります。
Ritesh Patadiya 2017年

27

「日差」のような表現は、見た目ほど単純ではありません。次の日付がある場合:

d1: 2011-10-15 23:59:00
d1: 2011-10-16 00:01:00

時差は2分、「日差」は1か0か?同様の問題は、月、年、または年、月、日の長さが異なり、時間も異なるため、違いを表す場合にも発生します(たとえば、夏時間が始まる日は通常より1時間短く、夏より2時間短い。終了します)。

時間を無視する日の差の関数、つまり上記の日付の場合は1を返します。

/*
   Get the number of days between two dates - not inclusive.

   "between" does not include the start date, so days
   between Thursday and Friday is one, Thursday to Saturday
   is two, and so on. Between Friday and the following Friday is 7.

   e.g. getDaysBetweenDates( 22-Jul-2011, 29-jul-2011) => 7.

   If want inclusive dates (e.g. leave from 1/1/2011 to 30/1/2011),
   use date prior to start date (i.e. 31/12/2010 to 30/1/2011).

   Only calculates whole days.

   Assumes d0 <= d1
*/
function getDaysBetweenDates(d0, d1) {

  var msPerDay = 8.64e7;

  // Copy dates so don't mess them up
  var x0 = new Date(d0);
  var x1 = new Date(d1);

  // Set to noon - avoid DST errors
  x0.setHours(12,0,0);
  x1.setHours(12,0,0);

  // Round to remove daylight saving errors
  return Math.round( (x1 - x0) / msPerDay );
}

これはより簡潔にすることができます:

/*  Return number of days between d0 and d1.
**  Returns positive if d0 < d1, otherwise negative.
**
**  e.g. between 2000-02-28 and 2001-02-28 there are 366 days
**       between 2015-12-28 and 2015-12-29 there is 1 day
**       between 2015-12-28 23:59:59 and 2015-12-29 00:00:01 there is 1 day
**       between 2015-12-28 00:00:01 and 2015-12-28 23:59:59 there are 0 days
**        
**  @param {Date} d0  - start date
**  @param {Date} d1  - end date
**  @returns {number} - whole number of days between d0 and d1
**
*/
function daysDifference(d0, d1) {
  var diff = new Date(+d1).setHours(12) - new Date(+d0).setHours(12);
  return Math.round(diff/8.64e7);
}

// Simple formatter
function formatDate(date){
  return [date.getFullYear(),('0'+(date.getMonth()+1)).slice(-2),('0'+date.getDate()).slice(-2)].join('-');
}

// Examples
[[new Date(2000,1,28), new Date(2001,1,28)],  // Leap year
 [new Date(2001,1,28), new Date(2002,1,28)],  // Not leap year
 [new Date(2017,0,1),  new Date(2017,1,1)] 
].forEach(function(dates) {
  document.write('From ' + formatDate(dates[0]) + ' to ' + formatDate(dates[1]) +
                 ' is ' + daysDifference(dates[0],dates[1]) + ' days<br>');
});


1
@ rudeovskiz​​ebear—IE、Firefox、Safariでテストされ、正常に動作します。これは、どのブラウザーでも機能すると予想される基本的なECMAScriptを使用していますが、何が機能しないのですか?
RobG 2013年

私はそれをテストページに置いたところ、
Chrome

@RafiB。—どちらがより正確であるかはわかりませんが、基本的に同じことを行います。つまり、UTC時間値を使用して1日の差を計算します。質問のあいまいさは明確にされていません。もしそうなら、それは別のソリューションにつながる可能性があります。
RobG 2013年

@RobGより簡潔なソリューションのコメントで例を編集してください。月は「22」ではなく「12」にする必要があります
S.aad

1
@ IgorKudryashov—申し訳ありません、私はそれを取得していません。2000年はうるう年なので、2000年2月28日から2001年2月28日は366日です。うるう年以外の年は365日です。さらにいくつかの例を追加しました。
RobG 2017

18
<html lang="en">
<head>
<script>
function getDateDiff(time1, time2) {
  var str1= time1.split('/');
  var str2= time2.split('/');

  //                yyyy   , mm       , dd
  var t1 = new Date(str1[2], str1[0]-1, str1[1]);
  var t2 = new Date(str2[2], str2[0]-1, str2[1]);

  var diffMS = t1 - t2;    
  console.log(diffMS + ' ms');

  var diffS = diffMS / 1000;    
  console.log(diffS + ' ');

  var diffM = diffS / 60;
  console.log(diffM + ' minutes');

  var diffH = diffM / 60;
  console.log(diffH + ' hours');

  var diffD = diffH / 24;
  console.log(diffD + ' days');
  alert(diffD);
}

//alert(getDateDiff('10/18/2013','10/14/2013'));
</script>
</head>
<body>
  <input type="button" 
       onclick="getDateDiff('10/18/2013','10/14/2013')" 
       value="clickHere()" />

</body>
</html>

助けになりません。同じアプローチでこれを数か月または数年に拡張することはできません。
tomazahlin

9

JavaScript関連のすべての日時計算にMoment.jsを使用する

あなたの質問への答えは:

var a = moment([2007, 0, 29]);   
var b = moment([2007, 0, 28]);    
a.diff(b) // 86400000  

詳細はこちら


4
そして、単なる日付の違いのために余分な400Kbを採用してください。
Romeo Mihalcea

@RomeoMihalcea現在の縮小されたmoment.js 2.22.2、1つのロケールは53 KB、17 KBがgzip圧縮されています。私はあなたの懸念を理解します。これは、1つの単純な関数に使用する巨大なライブラリーですが、日付/時刻に関連する多くの癖を処理し、多くの場合価値があります。
HeikoS

8
function DateDiff(date1, date2) {
    date1.setHours(0);
    date1.setMinutes(0, 0, 0);
    date2.setHours(0);
    date2.setMinutes(0, 0, 0);
    var datediff = Math.abs(date1.getTime() - date2.getTime()); // difference 
    return parseInt(datediff / (24 * 60 * 60 * 1000), 10); //Convert values days and return value      
}

解決策をありがとう:)
bhagirathi 2013

私が見つけたほとんどの解決策は、機能しないか、長すぎる。あなたの解決策はこれまでで最も簡単で、意図したとおりに機能します!乾杯:)
Bruce

1時間よりも正確に違いを知りたい場合はどうすればよいですか?投稿の質問には時間と秒がありますが、このすべてのゼロ設定についてはどうですか?
2oppin


6
var d1=new Date(2011,0,1); // jan,1 2011
var d2=new Date(); // now

var diff=d2-d1,sign=diff<0?-1:1,milliseconds,seconds,minutes,hours,days;
diff/=sign; // or diff=Math.abs(diff);
diff=(diff-(milliseconds=diff%1000))/1000;
diff=(diff-(seconds=diff%60))/60;
diff=(diff-(minutes=diff%60))/60;
days=(diff-(hours=diff%24))/24;

console.info(sign===1?"Elapsed: ":"Remains: ",
             days+" days, ",
             hours+" hours, ",
             minutes+" minutes, ",
             seconds+" seconds, ",
             milliseconds+" milliseconds.");

4

申し訳ありませんが、フラットなミリ秒の計算は信頼できません すべての応答に感謝しますが、1つが今日の日付に近い日付です。

うるう年、1970年の日付、2月29日など、すべてのシナリオをカバーする、私にとって最も効果的なアプローチ。

var someday = new Date("8/1/1985");
var today = new Date();
var years = today.getFullYear() - someday.getFullYear();

// Reset someday to the current year.
someday.setFullYear(today.getFullYear());

// Depending on when that day falls for this year, subtract 1.
if (today < someday)
{
    years--;
}
document.write("Its been " + years + " full years.");

3

moment.jsを使用している場合は、日付の違いを見つけるのは非常に簡単です。

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")

3
function DateDiff(b, e)
{
    let
        endYear = e.getFullYear(),
        endMonth = e.getMonth(),
        years = endYear - b.getFullYear(),
        months = endMonth - b.getMonth(),
        days = e.getDate() - b.getDate();
    if (months < 0)
    {
        years--;
        months += 12;
    }
    if (days < 0)
    {
        months--;
        days += new Date(endYear, endMonth, 0).getDate();
    }
    return [years, months, days];
}

[years, months, days] = DateDiff(
    new Date("October 21, 1980"),
    new Date("July 11, 2017")); // 36 8 20

3

これでうまくいくと思います。

let today = new Date();
let form_date=new Date('2019-10-23')
let difference=form_date>today ? form_date-today : today-form_date
let diff_days=Math.floor(difference/(1000*3600*24))

2

これは、フレームワークなしで日付間の差を実装する方法です。

function getDateDiff(dateOne, dateTwo) {
        if(dateOne.charAt(2)=='-' & dateTwo.charAt(2)=='-'){
            dateOne = new Date(formatDate(dateOne));
            dateTwo = new Date(formatDate(dateTwo));
        }
        else{
            dateOne = new Date(dateOne);
            dateTwo = new Date(dateTwo);            
        }
        let timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime());
        let diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
        let diffMonths = Math.ceil(diffDays/31);
        let diffYears = Math.ceil(diffMonths/12);

        let message = "Difference in Days: " + diffDays + " " +
                      "Difference in Months: " + diffMonths+ " " + 
                      "Difference in Years: " + diffYears;
        return message;
     }

    function formatDate(date) {
         return date.split('-').reverse().join('-');
    }

    console.log(getDateDiff("23-04-2017", "23-04-2018"));

1

function daysInMonth (month, year) {
    return new Date(year, month, 0).getDate();
}
function getduration(){

let A= document.getElementById("date1_id").value
let B= document.getElementById("date2_id").value

let C=Number(A.substring(3,5))
let D=Number(B.substring(3,5))
let dif=D-C
let arr=[];
let sum=0;
for (let i=0;i<dif+1;i++){
  sum+=Number(daysInMonth(i+C,2019))
}
let sum_alter=0;
for (let i=0;i<dif;i++){
  sum_alter+=Number(daysInMonth(i+C,2019))
}
let no_of_month=(Number(B.substring(3,5)) - Number(A.substring(3,5)))
let days=[];
if ((Number(B.substring(3,5)) - Number(A.substring(3,5)))>0||Number(B.substring(0,2)) - Number(A.substring(0,2))<0){
days=Number(B.substring(0,2)) - Number(A.substring(0,2)) + sum_alter
}

if ((Number(B.substring(3,5)) == Number(A.substring(3,5)))){
console.log(Number(B.substring(0,2)) - Number(A.substring(0,2)) + sum_alter)
}

time_1=[]; time_2=[]; let hour=[];
 time_1=document.getElementById("time1_id").value
 time_2=document.getElementById("time2_id").value
  if (time_1.substring(0,2)=="12"){
     time_1="00:00:00 PM"
  }
if (time_1.substring(9,11)==time_2.substring(9,11)){
hour=Math.abs(Number(time_2.substring(0,2)) - Number(time_1.substring(0,2)))
}
if (time_1.substring(9,11)!=time_2.substring(9,11)){
hour=Math.abs(Number(time_2.substring(0,2)) - Number(time_1.substring(0,2)))+12
}
let min=Math.abs(Number(time_1.substring(3,5))-Number(time_2.substring(3,5)))
document.getElementById("duration_id").value=days +" days "+ hour+"  hour " + min+"  min " 
}
<input type="text" id="date1_id" placeholder="28/05/2019">
<input type="text" id="date2_id" placeholder="29/06/2019">
<br><br>
<input type="text" id="time1_id" placeholder="08:01:00 AM">
<input type="text" id="time2_id" placeholder="00:00:00 PM">
<br><br>
<button class="text" onClick="getduration()">Submit </button>
<br><br>
<input type="text" id="duration_id" placeholder="days hour min">


このコードは、日数、時間、さらには分数に関する正確な結果を提供します
Maximus Su

あなたがそれを使っていることを願っています
Maximus Su

0

OK、それを行う方法はたくさんあります。はい、プレーンな古いJSを使用できます。ちょうど試して:

let dt1 = new Date()
let dt2 = new Date()

Date.prototype.setMinutesを使用してパッセージをエミュレートして、範囲内にあることを確認しましょう。

dt1.setMinutes(7)
dt2.setMinutes(42)
console.log('Elapsed seconds:',(dt2-dt1)/1000)

あるいは、js-jodaなどのライブラリを使用して、次のようなことを簡単に行うことができます(ドキュメントから直接)。

var dt1 = LocalDateTime.parse("2016-02-26T23:55:42.123");
var dt2 = dt1
  .plusYears(6)
  .plusMonths(12)
  .plusHours(2)
  .plusMinutes(42)
  .plusSeconds(12);

// obtain the duration between the two dates
dt1.until(dt2, ChronoUnit.YEARS); // 7
dt1.until(dt2, ChronoUnit.MONTHS); // 84
dt1.until(dt2, ChronoUnit.WEEKS); // 356
dt1.until(dt2, ChronoUnit.DAYS); // 2557
dt1.until(dt2, ChronoUnit.HOURS); // 61370
dt1.until(dt2, ChronoUnit.MINUTES); // 3682242
dt1.until(dt2, ChronoUnit.SECONDS); // 220934532

cのライブラリはもっと​​たくさんありますが、js-jodaにはJavaでも利用できるという追加のボーナスがあります。これらのテストはすべてjs-jodaに移行されましたが、これも不変です。


-1

残りの時間を表示する必要がある場合、これは問題なく機能します。JavaScriptはその時間にフレームを使用するため、終了時間を取得します。その後、時間RNを1000で除算できます。これは、見かけ上1000フレーム= 1秒なので、その後は基本的な時間の計算を使用できますが、このコードにはまだ問題があります。計算は静的であるため、1年(360/365/366)の異なる日の合計を補正することはできません。計算後、時間が0未満の場合にそれをnullにする場合、それがあなたが求めているものと正確に一致していない場合でも、これが役立つことを願っています。

var now = new Date();
var end = new Date("End Time");
var total = (end - now) ;
var totalD =  Math.abs(Math.floor(total/1000));

var years = Math.floor(totalD / (365*60*60*24));
var months = Math.floor((totalD - years*365*60*60*24) / (30*60*60*24));
var days = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24)/ (60*60*24));
var hours = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24)/ (60*60));
var minutes = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24 - hours*60*60)/ (60));
var seconds = Math.floor(totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24 - hours*60*60 - minutes*60);

var Y = years < 1 ? "" : years + " Years ";
var M = months < 1 ? "" : months + " Months ";
var D = days < 1 ? "" : days + " Days ";
var H = hours < 1 ? "" : hours + " Hours ";
var I = minutes < 1 ? "" : minutes + " Minutes ";
var S = seconds < 1 ? "" : seconds + " Seconds ";
var A = years == 0 && months == 0 && days == 0 && hours == 0 && minutes == 0 && seconds == 0 ? "Sending" : " Remaining";

document.getElementById('txt').innerHTML = Y + M + D + H + I + S + A;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.