JavaScriptで2つの日付間の日数を取得するにはどうすればよいですか?


403

JavaScriptで2つの日付間の日数を取得するにはどうすればよいですか?たとえば、入力ボックスに2つの日付が与えられたとします。

<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>

5
ユーザーが「2つの日付間の日数」を尋ねるケースの99%は、彼女が理解していないことは、リンゴと梨を比較しようとしていることです。「DATE RANGEにはいくつのDATESがありますか?」と尋ねると、問題は非常に単純になります。これにより、時間や夏時間の問題などがなくなります。日時データ構造が純粋にナンセンスであるため、混乱が暗示されます。日時は日付があると時間、両方の性質や行動の2つの非常に異なるオブジェクトが存在するようなものはありません
ミハイルShishkov

差を(全体の)時間単位に分割する関数については、stackoverflow.com / a / 53092438/3787376の回答を使用してください。
エドワード

ほとんどの回答が正しくないか、さまざまなライブラリに依存しているため、この質問は削除するか、少なくとも「回避」とマークする必要があります。
RobG

回答:


409

質問に示されているように、問題を解決するための概念の証明として、の迅速でダーティな実装を以下datediffに示します。これは、2つの日付の間の経過ミリ秒を減算して、それらをそれらのプリミティブな数値(1970年の初めからのミリ秒)に強制できるという事実に依存しています。

// new Date("dateString") is browser-dependent and discouraged, so we'll write
// a simple parse function for U.S. date format (which does no error checking)
function parseDate(str) {
    var mdy = str.split('/');
    return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

function datediff(first, second) {
    // Take the difference between the dates and divide by milliseconds per day.
    // Round to nearest whole number to deal with DST.
    return Math.round((second-first)/(1000*60*60*24));
}

alert(datediff(parseDate(first.value), parseDate(second.value)));
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

「通常の」Date API(名前に「UTC」がない)はユーザーのブラウザのローカルタイムゾーンで動作するため、一般に、ユーザーがタイムゾーンに属していない場合に問題が発生する可能性があることに注意してください期待し、あなたのコードは夏時間の遷移に対処する必要があります。Dateオブジェクトとそのメソッドのドキュメントを注意深く読み、より複雑なものについては、日付を操作するためのより安全で強力なAPIを提供するライブラリの使用を強く検討してください。

また、例証の目的で、スニペットは簡潔にするためwindowオブジェクト名前付きアクセスを使用していますが、本番環境では、getElementByIdなどの標準化されたAPI 、またはより可能性の高いいくつかのUIフレームワークを使用する必要があります。


2
Math.trunc()の方が適切だと思います。誰かがより正確なDateオブジェクト(時間、分、秒を含む)を使用する場合に備えて
Jin Wang

21
(現時点で)正解で最高の票が付けられた回答として、この回答が夏時間を正しく処理しないことはコメントする価値があります。代わりにMichael Liuの回答を参照してください。
osullic 2016

parseDateは正確に何をしますか?
Mohammad Kermani 2016年

2
@osullic —この回答はMath.roundで夏時間を処理しますが、日付と時刻ではなく日付のみの文字列が渡されることを期待しています。
RobG 2017

2
この例では、日付が米国の形式、つまりMM / DD / YYYYであることを覚えておいてください。あなたは英国のバージョンが必要な場合は、変更する必要がparseDateあることを方法を:return new Date(mdy[2], mdy[1], mdy[0]-1);
Viqas

207

これを書いている時点では、他の回答の1つだけがDST(夏時間)の移行を正しく処理しています。カリフォルニアにあるシステムでの結果は次のとおりです。

                                        1/1/2013- 3/10/2013- 11/3/2013-
User       Formula                      2/1/2013  3/11/2013  11/4/2013  Result
---------  ---------------------------  --------  ---------  ---------  ---------
Miles                   (d2 - d1) / N   31        0.9583333  1.0416666  Incorrect
some         Math.floor((d2 - d1) / N)  31        0          1          Incorrect
fuentesjr    Math.round((d2 - d1) / N)  31        1          1          Correct
toloco     Math.ceiling((d2 - d1) / N)  31        1          2          Incorrect

N = 86400000

Math.round正しい結果が返されますが、多少不格好だと思います。代わりに、DSTの開始時または終了時にUTCオフセットへの変更を明示的に考慮することにより、正確な計算を使用できます。

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

alert(daysBetween($('#first').val(), $('#second').val()));

説明

Dateオブジェクトは時刻をローカル時刻ではなくUTCで内部的に保存するため、JavaScriptの日付計算は注意が必要です。たとえば、3/10/2013 12:00 AM Pacific Standard Time(UTC-08:00)は3/10/2013 8:00 AM UTCとして保存され、3/11/2013 12:00 AM Pacific Daylight Time( UTC-07:00)は、2013年3月11日の午前7時UTCとして保存されます。この日、現地時間の午前0時から午前0時はUTCで23時間のみです。

現地時間の1日は24時間より長くても短くてもかまいませんが、UTCでは1日は常に正確に24時間です。1上記のdaysBetween方法はtreatAsUTC、減算と除算の前に、両方の現地時間をUTCの午前0時に調整することを最初に呼び出すことにより、この事実を利用しています。

1. JavaScriptはうるう秒を無視します。


2
UTCを使用する必要はありません。現地時間を午前0時(または両方の日付に同じ値)に設定するだけで問題ありません。夏時間によって導入される端数の日はせいぜい±0.04(そしていくつかの場所ではそれより少ない)なので、Math.round丸めます。;-)文字列を解析するために日付コンストラクタに依存することは良い考えではありません。本当にUTC値を使用したい場合Date.UTC(...)は、最初にを使用して文字列を解析します。
RobG 2017

2
@RobG:私の回答で述べたように、「Math.roundは正しい結果を返しますが、多少不格好だと思います。代わりに、DSTが開始または終了するときにUTCオフセットへの変更を明示的に考慮することにより、正確な演算を使用できます。」
Michael Liu

実際、「正しくない」と表現した時間は、技術的には正しいものです。DateTimesをUTCに変更していません...各DateTimeの時刻を変更して、人工的な整数を取得しています。丸めは「不格好」ではありません...とにかく頭の中でそれをしているので、ここではまさに正しいアプローチです。時間の部分(時間、分、秒)を丸めて、全体を取得しようとしています。日番号。
JDBは、

116

2つの日付の差を取得する最も簡単な方法:

var diff =  Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000); 

差分日数(または一方または両方を解析できなかった場合はNaN)を取得します。解析日はミリ秒で結果を与え、それを日ごとに取得するには、24 * 60 * 60 * 1000で割る必要があります

日、時間、分、秒、ミリ秒で除算する場合:

function dateDiff( str1, str2 ) {
    var diff = Date.parse( str2 ) - Date.parse( str1 ); 
    return isNaN( diff ) ? NaN : {
        diff : diff,
        ms : Math.floor( diff            % 1000 ),
        s  : Math.floor( diff /     1000 %   60 ),
        m  : Math.floor( diff /    60000 %   60 ),
        h  : Math.floor( diff /  3600000 %   24 ),
        d  : Math.floor( diff / 86400000        )
    };
}

これがJamesバージョンの私のリファクタリングされたバージョンです:

function mydiff(date1,date2,interval) {
    var second=1000, minute=second*60, hour=minute*60, day=hour*24, week=day*7;
    date1 = new Date(date1);
    date2 = new Date(date2);
    var timediff = date2 - date1;
    if (isNaN(timediff)) return NaN;
    switch (interval) {
        case "years": return date2.getFullYear() - date1.getFullYear();
        case "months": return (
            ( date2.getFullYear() * 12 + date2.getMonth() )
            -
            ( date1.getFullYear() * 12 + date1.getMonth() )
        );
        case "weeks"  : return Math.floor(timediff / week);
        case "days"   : return Math.floor(timediff / day); 
        case "hours"  : return Math.floor(timediff / hour); 
        case "minutes": return Math.floor(timediff / minute);
        case "seconds": return Math.floor(timediff / second);
        default: return undefined;
    }
}

2
悪い答え。Math.floor()は、夏時間で時計が進むと1日失われます。Math.round()はほとんどの状況で正しい答えを提供しますが、他の答えにもより良いオプションがあります。
Phil B

101

moment.jsライブラリ(http://momentjs.com/docs/#/displaying/difference/)の使用をお勧めします。これは夏時間を正しく処理し、一般的に作業するのに最適です。

例:

var start = moment("2013-11-03");
var end = moment("2013-11-04");
end.diff(start, "days")
1

10
Momentjsが優れているという警告と同様に、これはかなり大きな依存関係です
Jason Axelson

end.diff(start,"days")開始日が終了日より後であるため、記述されたコードは機能しますが、実際にはそうなります!
gordon613 2017年

40

私は先に進んでこの小さなユーティリティつかむでしょう、そしてその中にあなたはあなたのためにこれに対する機能を見つけるでしょう。以下に短い例を示します。

        <script type="text/javascript" src="date.js"></script>
        <script type="text/javascript">
            var minutes = 1000*60;
            var hours = minutes*60;
            var days = hours*24;

            var foo_date1 = getDateFromFormat("02/10/2009", "M/d/y");
            var foo_date2 = getDateFromFormat("02/12/2009", "M/d/y");

            var diff_date = Math.round((foo_date2 - foo_date1)/days);
            alert("Diff date is: " + diff_date );
        </script>

28
const startDate = '2017-11-08';
const endDate   = '2017-10-01';
const timeDiff  = (new Date(startDate)) - (new Date(endDate));
const days      = timeDiff / (1000 * 60 * 60 * 24)
  1. 開始日を設定
  2. 終了日を設定
  3. 差を計算する
  4. ミリ秒を日に変換

更新:私はこれがあなたの質問の一部ではないことを知っていますが、一般的に、バニラJavaScriptで日付の計算や操作を行うことはお勧めしません。多くのエッジケースのため、date-fnsmoment.jsなどのライブラリを使用することはお勧めしません。


5
私はこれらのような答えに感謝します:短くてシンプルでランダムな依存関係は必要ありません!乾杯。
daCoda

2
timeDiffネガティブに戻ったのは私だけですか?すべきではtimeDiffない(new Date(endDate)) - (new Date(startDate));
Feyisayo Sonubi

@ feyisayo-sonubiは、開始日と終了日を渡す順序によって異なります。この例では(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
-marcobiedermann、

const timeDiff = +(new Date(start)) - +(new Date(end));
ベンラシコット

すごい。私は好きですがreturn (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
dcromley

13

Moment.jsの使用

var future = moment('05/02/2015');
var start = moment('04/23/2015');
var d = future.diff(start, 'days'); // 9
console.log(d);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>


moment.jsは、YTDの差分などに非常に便利です。 var now = moment(), yearStart = moment().startOf('year'); var ytdDays = now.diff(yearStart, 'days'); // this can be years, months, weeks, days, hours, minutes, and seconds console.log(ytdDays); ここでは、momentjs.com
Sharif

11

JSの日付値は日時値です。

したがって、直接の日付計算は一貫していません:

(2013-11-05 00:00:00) - (2013-11-04 10:10:10) < 1 day

たとえば、2番目の日付を変換する必要があります。

(2013-11-05 00:00:00) - (2013-11-04 00:00:00) = 1 day

この方法では、両方の日付でミルを切り捨てることができます。

var date1 = new Date('2013/11/04 00:00:00');
var date2 = new Date('2013/11/04 10:10:10'); //less than 1
var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);

date2 = new Date('2013/11/05 00:00:00'); //1

var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);


9

UTC時間を使用して、DST、Math.ceil、Math.floorなどを取り除く方が良いでしょう。

var firstDate = Date.UTC(2015,01,2);
var secondDate = Date.UTC(2015,04,22);
var diff = Math.abs((firstDate.valueOf() 
    - secondDate.valueOf())/(24*60*60*1000));

この例では、109日の差が出ます。24*60*60*1000ミリ秒単位の1日です。


9

指定された2つの日付間の日数を計算するには、次のコードを使用できます。ここで使用する日付は、2016年1月1日と2016年12月31日です。

var day_start = new Date("Jan 01 2016");
var day_end = new Date("Dec 31 2016");
var total_days = (day_end - day_start) / (1000 * 60 * 60 * 24);
document.getElementById("demo").innerHTML = Math.round(total_days);
<h3>DAYS BETWEEN GIVEN DATES</h3>
<p id="demo"></p>


9

次の式を使用して、異なるTZにまたがる2つの日付間の完全な証明日の差を計算することが可能です。

var start = new Date('10/3/2015');
var end = new Date('11/2/2015');
var days = (end - start) / 1000 / 60 / 60 / 24;
console.log(days);
// actually its 30 ; but due to daylight savings will show 31.0xxx
// which you need to offset as below
days = days - (end.getTimezoneOffset() - start.getTimezoneOffset()) / (60 * 24);
console.log(days);


これが最も正解です。夏時間を考慮する必要があります。ありがとう
ギスウェイ

6

2つの日付で計算したいときにこの質問を見つけましたが、日付には時間と分の値があり、要件に合わせて@ michael-liuの回答を変更し、テストに合格しました。

差分日2012-12-31 23:00及び2013-01-01 01:001(2時間)差分日等しくなければならない2012-12-31 01:00し、2013-01-01 23:001(46時間)に等しくなければなりません

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

var millisecondsPerDay = 24 * 60 * 60 * 1000;
function diffDays(startDate, endDate) {
    return Math.floor(treatAsUTC(endDate) / millisecondsPerDay) - Math.floor(treatAsUTC(startDate) / millisecondsPerDay);
}


6

私は解決策は、私が使用することになり、100%正確ではないと思います切り上げを代わりに、ラウンド意志の仕事が、それは右の操作ではありません。

function dateDiff(str1, str2){
    var diff = Date.parse(str2) - Date.parse(str1); 
    return isNaN(diff) ? NaN : {
        diff: diff,
        ms: Math.ceil(diff % 1000),
        s: Math.ceil(diff / 1000 % 60),
        m: Math.ceil(diff / 60000 % 60),
        h: Math.ceil(diff / 3600000 % 24),
        d: Math.ceil(diff / 86400000)
    };
}

4
日数は24時間を超える場合があり、分数は60秒を超える場合があります。これらの場合、Math.ceil()を使用すると過大評価されます。
Rich Dougherty

5

DatePickerウィジェットからformatDateを使用するのはどうですか?これを使用して、日付をタイムスタンプ形式(1970年1月1日からのミリ秒)に変換してから、単純な減算を実行できます。


5

function timeDifference(date1, date2) {
  var oneDay = 24 * 60 * 60; // hours*minutes*seconds
  var oneHour = 60 * 60; // minutes*seconds
  var oneMinute = 60; // 60 seconds
  var firstDate = date1.getTime(); // convert to milliseconds
  var secondDate = date2.getTime(); // convert to milliseconds
  var seconds = Math.round(Math.abs(firstDate - secondDate) / 1000); //calculate the diffrence in seconds
  // the difference object
  var difference = {
    "days": 0,
    "hours": 0,
    "minutes": 0,
    "seconds": 0,
  }
  //calculate all the days and substract it from the total
  while (seconds >= oneDay) {
    difference.days++;
    seconds -= oneDay;
  }
  //calculate all the remaining hours then substract it from the total
  while (seconds >= oneHour) {
    difference.hours++;
    seconds -= oneHour;
  }
  //calculate all the remaining minutes then substract it from the total 
  while (seconds >= oneMinute) {
    difference.minutes++;
    seconds -= oneMinute;
  }
  //the remaining seconds :
  difference.seconds = seconds;
  //return the difference object
  return difference;
}
console.log(timeDifference(new Date(2017,0,1,0,0,0),new Date()));


1
回答の前後にもう少し詳しい説明を追加してください。コードのみの回答は理解するのが困難です。投稿に情報を追加できれば、質問者と将来の読者の両方に役立ちます。
RBT 2017年

私が編集したかったが、私は編集を提出することができ:(エラーを得ていた。
Noreddine Belhadj Cheikh

2
@ N.Belhadjでは、すべてのwhileループを単純なdivおよびmod(%)演算で置き換えることができます
Mihail Shishkov

4

これは最もエレガントな解決策ではないかもしれませんが、比較的単純なコードで質問に答えるように思われます。次のようなものは使用できません:

function dayDiff(startdate, enddate) {
  var dayCount = 0;

  while(enddate >= startdate) {
    dayCount++;
    startdate.setDate(startdate.getDate() + 1);
  }

return dayCount; 
}

これは、日付オブジェクトをパラメーターとして渡すことを前提としています。


4

UNIXタイムスタンプが2つある場合は、この関数を使用できます(明確にするために、もう少し詳細にしています)。

// Calculate number of days between two unix timestamps
// ------------------------------------------------------------
var daysBetween = function(timeStampA, timeStampB) {
    var oneDay = 24 * 60 * 60 * 1000; // hours * minutes * seconds * milliseconds
    var firstDate = new Date(timeStampA * 1000);
    var secondDate = new Date(timeStampB * 1000);
    var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    return diffDays;
};

例:

daysBetween(1096580303, 1308713220); // 2455

4

ミリ秒を使用するときは注意しください。

date.getTimeは()ミリ秒を返し、やっミリ秒で数学の操作は含まれている必要があり

  • 夏時間(DST)
  • 両方の日付が同じ時間(時間、分、秒、ミリ秒)かどうかを確認する
  • 日差の動作が必要であることを確認してください:2016年9月19日-2016年9月29日= 1日または2日の違い?

上記のコメントの例は、私がこれまでに見つけた最良のソリューションです https://stackoverflow.com/a/11252167/2091095。ただし、関係するすべての日をカウントする場合は、結果に+1を使用します。

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

var diff = daysBetween($('#first').val(), $('#second').val()) + 1;

4

Date.prototype.days = function(to) {
  return Math.abs(Math.floor(to.getTime() / (3600 * 24 * 1000)) - Math.floor(this.getTime() / (3600 * 24 * 1000)))
}


console.log(new Date('2014/05/20').days(new Date('2014/05/23'))); // 3 days

console.log(new Date('2014/05/23').days(new Date('2014/05/20'))); // 3 days


3

Angularでも同じ問題が発生しました。他の人が最初の日付を上書きするので、私はコピーを行います。両方の日付の時刻は00:00:00でなければなりません(明らかに)

 /*
* Deze functie gebruiken we om het aantal dagen te bereken van een booking.
* */
$scope.berekenDagen = function ()
{
    $scope.booking.aantalDagen=0;

    /*De loper is gelijk aan de startdag van je reservatie.
     * De copy is nodig anders overschijft angular de booking.van.
     * */
    var loper = angular.copy($scope.booking.van);

    /*Zolang de reservatie beschikbaar is, doorloop de weekdagen van je start tot einddatum.*/
    while (loper < $scope.booking.tot) {
        /*Tel een dag op bij je loper.*/
        loper.setDate(loper.getDate() + 1);
        $scope.booking.aantalDagen++;
    }

    /*Start datum telt natuurlijk ook mee*/
    $scope.booking.aantalDagen++;
    $scope.infomsg +=" aantal dagen: "+$scope.booking.aantalDagen;
};

3

以下のコードを使用して、ニュース投稿の投稿日機能を実験しました。投稿日と現在の日付に基づいて、分または時間または日または年を計算します。

var startDate= new Date("Mon Jan 01 2007 11:00:00");
var endDate  =new Date("Tue Jan 02 2007 12:50:00");
var timeStart = startDate.getTime();
var timeEnd = endDate.getTime();
var yearStart = startDate.getFullYear();
var yearEnd   = endDate.getFullYear();
if(yearStart == yearEnd)
 {
  var hourDiff = timeEnd - timeStart; 
  var secDiff = hourDiff / 1000;
  var minDiff = hourDiff / 60 / 1000; 
  var hDiff = hourDiff / 3600 / 1000; 
  var myObj = {};
  myObj.hours = Math.floor(hDiff);
  myObj.minutes = minDiff  
  if(myObj.hours >= 24)
   {
    console.log(Math.floor(myObj.hours/24) + "day(s) ago")
   } 
 else if(myObj.hours>0)
  {
   console.log(myObj.hours +"hour(s) ago")
  }
 else
  {
   console.log(Math.abs(myObj.minutes) +"minute(s) ago")
  }
}
else
{
var yearDiff = yearEnd - yearStart;
console.log( yearDiff +" year(s) ago");
}

コードを説明してください。問題を解決しました。コードを貼り付けるだけでは不適切です。
Marco Scabbiolo 16

2
このコードは質問に答えることがありますが、問題を解決する方法理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
Michael Parker

コメントについて@ MarcoScabbiolo、@ Michael Parkerに感謝します。回答に関してStackoverflowを
初めて使用する

3

日付を含むDateArrayが欲しい場合は、これを試してください:

<script>
        function getDates(startDate, stopDate) {
        var dateArray = new Array();
        var currentDate = moment(startDate);
        dateArray.push( moment(currentDate).format('L'));

        var stopDate = moment(stopDate);
        while (dateArray[dateArray.length -1] != stopDate._i) {
            dateArray.push( moment(currentDate).format('L'));
            currentDate = moment(currentDate).add(1, 'days');
        }
        return dateArray;
      }
</script>

DebugSnippet


3

2つの日付間の日数を計算する簡単な方法は、時間コンポーネントの両方を削除することです。つまり、時間、分、秒、ミリ秒を0に設定してから、それらの時間を差し引いて、ミリ秒に相当する1日を計算します。

var firstDate= new Date(firstDate.setHours(0,0,0,0));
var secondDate= new Date(secondDate.setHours(0,0,0,0));
var timeDiff = firstDate.getTime() - secondDate.getTime();
var diffDays =timeDiff / (1000 * 3600 * 24);

あなたの解決策の問題は、firstDateとsecondDateを日付であると仮定しているため、それらを日付に再度変更する必要はなく、日付でない場合(そうでない場合)、setHoursでエラーが発生します。これを修正するには、setHoursをnew Date
AaA

2
function formatDate(seconds, dictionary) {
    var foo = new Date;
    var unixtime_ms = foo.getTime();
    var unixtime = parseInt(unixtime_ms / 1000);
    var diff = unixtime - seconds;
    var display_date;
    if (diff <= 0) {
        display_date = dictionary.now;
    } else if (diff < 60) {
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.second;
        } else {
            display_date = diff + ' ' + dictionary.seconds;
        }
    } else if (diff < 3540) {
        diff = Math.round(diff / 60);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.minute;
        } else {
            display_date = diff + ' ' + dictionary.minutes;
        }
    } else if (diff < 82800) {
        diff = Math.round(diff / 3600);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.hour;
        } else {
            display_date = diff + ' ' + dictionary.hours;
        }
    } else {
        diff = Math.round(diff / 86400);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.day;
        } else {
            display_date = diff + ' ' + dictionary.days;
        }
    }
    return display_date;
}

2

シンプルで洗練されたシンプル。この関数は時間を更新するために1秒ごとに呼び出されます。

const year = (new Date().getFullYear());
const bdayDate = new Date("04,11,2019").getTime();  //mmddyyyy

// countdown
let timer = setInterval(function() {

// get today's date
const today = new Date().getTime();

// get the difference
const diff = bdayDate - today;

// math
let days = Math.floor(diff / (1000 * 60 * 60 * 24));
let hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
let minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
let seconds = Math.floor((diff % (1000 * 60)) / 1000);

}, 1000);

1

より良い解決策

時間部分を無視する

両方の日付が同じ場合は0を返します。

function dayDiff(firstDate, secondDate) {
  firstDate = new Date(firstDate);
  secondDate = new Date(secondDate);
  if (!isNaN(firstDate) && !isNaN(secondDate)) {
    firstDate.setHours(0, 0, 0, 0); //ignore time part
    secondDate.setHours(0, 0, 0, 0); //ignore time part
    var dayDiff = secondDate - firstDate;
    dayDiff = dayDiff / 86400000; // divide by milisec in one day
    console.log(dayDiff);
  } else {
    console.log("Enter valid date.");
  }
}

$(document).ready(function() {
  $('input[type=datetime]').datepicker({
    dateFormat: "mm/dd/yy",
    changeMonth: true,
    changeYear: true
  });
  $("#button").click(function() {
    dayDiff($('#first').val(), $('#second').val());
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<input type="datetime" id="first" value="12/28/2016" />
<input type="datetime" id="second" value="12/28/2017" />
<input type="button" id="button" value="Calculate">


1

1970-01-01以前および2038-01-19以降の日付の寄付

function DateDiff(aDate1, aDate2) {
  let dDay = 0;
  this.isBissexto = (aYear) => {
    return (aYear % 4 == 0 && aYear % 100 != 0) || (aYear % 400 == 0);
  };
  this.getDayOfYear = (aDate) => {
    let count = 0;
    for (let m = 0; m < aDate.getUTCMonth(); m++) {
      count += m == 1 ? this.isBissexto(aDate.getUTCFullYear()) ? 29 : 28 : /(3|5|8|10)/.test(m) ? 30 : 31;
    }
    count += aDate.getUTCDate();
    return count;
  };
  this.toDays = () => {
    return dDay;
  };
  (() => {
    let startDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate1.toISOString()) : new Date(aDate2.toISOString());
    let endDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate2.toISOString()) : new Date(aDate1.toISOString());
    while (startDate.getUTCFullYear() != endDate.getUTCFullYear()) {
      dDay += (this.isBissexto(startDate.getFullYear())? 366 : 365) - this.getDayOfYear(startDate) + 1;
      startDate = new Date(startDate.getUTCFullYear()+1, 0, 1);
    }
    dDay += this.getDayOfYear(endDate) - this.getDayOfYear(startDate);
  })();
}

0
   function validateDate() {
        // get dates from input fields
        var startDate = $("#startDate").val();
        var endDate = $("#endDate").val();
        var sdate = startDate.split("-");
        var edate = endDate.split("-");
        var diffd = (edate[2] - sdate[2]) + 1;
        var leap = [ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        var nonleap = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        if (sdate[0] > edate[0]) {
            alert("Please enter End Date Year greater than Start Date Year");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[1] > edate[1]) {
            alert("Please enter End Date month greater than Start Date month");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[2] > edate[2]) {
            alert("Please enter End Date greater than Start Date");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else {
            if (sdate[0] / 4 == 0) {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + leap[sdate[1]++];
                }
            } else {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + nonleap[sdate[1]++];
                }
            }
            document.getElementById("numberOfDays").value = diffd;
        }
    }

0

UnderscoreJSを使用して、差分のフォーマットと計算を行うことができます。

デモ https://jsfiddle.net/sumitridhal/8sv94msp/

 var startDate = moment("2016-08-29T23:35:01");
var endDate = moment("2016-08-30T23:35:01");  
  

console.log(startDate);
console.log(endDate);

var resultHours = endDate.diff(startDate, 'hours', true);

document.body.innerHTML = "";
document.body.appendChild(document.createTextNode(resultHours));
body { white-space: pre; font-family: monospace; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.