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


111

時間枠でイベントを定義できるアプリケーションを作成しています。ユーザーが開始日を選択または変更したときに、自動的に終了日を入力したい。ただし、2つの時間の差を取得する方法、およびその差を使用して新しい終了日を作成する方法を完全に理解することはできません。

回答:


73

JavaScriptでは、getTime()メソッドを呼び出す、数値式で日付を使用するだけで、日付をepoc以降のミリ秒数に変換できます。

したがって、差を求めるには、2つの日付を減算します。

違いに基づいて新しい日付を作成するには、コンストラクターにミリ秒数を渡すだけです。

var oldBegin = ...
var oldEnd = ...
var newBegin = ...

var newEnd = new Date(newBegin + oldEnd - oldBegin);

これはうまくいくはずです

編集:@bdukesによって指摘されたバグを修正

編集

動作の説明については、oldBeginoldEnd、とnewBeginしているDateインスタンス。演算子+を呼び出すと、-JavaScript自動キャストがトリガーされvalueOf()、それらのオブジェクトのプロトタイプメソッドが自動的に呼び出されます。ことが起こるvalueOf()方法が実装されるDateの呼び出しなどのオブジェクトgetTime()

だから基本的に: date.getTime() === date.valueOf() === (0 + date) === (+date)


.getTime()が機能するために必要な形式は何ですか?たとえば-new Date('22 -12-2012 00:00 ')。getTime()は機能しません...何かアイデアはありますか?
Jimmyt1988

1
:JSで解析する日付のために、私はあなたがこの質問を見てい示唆stackoverflow.com/questions/1576753/...
ヴィンセントロバート・

8
OldBegin、oldEnd、およびNewBeginはDateオブジェクトであるはずですか?ここでは変数宣言が省略されているため、想定されるオブジェクトのタイプを判別することは困難です。
アンダーソングリーン

また、JavaScriptで日付を加算または減算するために使用できる関数があります。stackoverflow.com
Anderson Green

数字と日を追加するときは注意してください。説明については、以下の私の回答を参照してください
ダン

24

JavaScriptはすぐに日付の違いを完全にサポートします

var msMinute = 60*1000, 
    msDay = 60*60*24*1000,
    a = new Date(2012, 2, 12, 23, 59, 59),
    b = new Date("2013 march 12");


console.log(Math.floor((b - a) / msDay) + ' full days between');
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between');

今いくつかの落とし穴。これを試して:

console.log(a - 10);
console.log(a + 10);

したがって、数値と日付を追加するリスクがある場合は、日付をnumber直接に変換します。

console.log(a.getTime() - 10);
console.log(a.getTime() + 10);

私の最初の例は日付オブジェクトの力を示していますが、実際には時限爆弾のようです


ダン、私はあなたの例が理解して従うのが最も簡単だと思いました。ありがとう。
メラニー

5
「落とし穴」は、実際には言語仕様に基づくデフォルトです。減算演算子-は引数を数値に強制変換するので、日付はその時刻値を返します。+演算子はオーバーロードされ、その数や連結に、強制を追加を行う可能性があります。この場合、日付は文字列に強制変換されるため、+連結は行われます。混乱はDateオブジェクトのせいではなく、演算子のオーバーロードのせいです。
RobG 2016年

9

JsFiddleデモを見る

    var date1 = new Date();    
    var date2 = new Date("2025/07/30 21:59:00");
    //Customise date2 for your required future time

    showDiff();

function showDiff(date1, date2){

    var diff = (date2 - date1)/1000;
    diff = Math.abs(Math.floor(diff));

    var days = Math.floor(diff/(24*60*60));
    var leftSec = diff - days * 24*60*60;

    var hrs = Math.floor(leftSec/(60*60));
    var leftSec = leftSec - hrs * 60*60;

    var min = Math.floor(leftSec/(60));
    var leftSec = leftSec - min * 60;

    document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death.";

setTimeout(showDiff,1000);
}

あなたのHTMLコード:

<div id="showTime"></div>

4

時間コンポーネントを気にしない場合は、.getDate()および.setDate()を使用して日付部分を設定できます。

終了日を開始日から2週間後に設定するには、次のようにします。

function GetEndDate(startDate)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate()+14);
    return endDate;
}

2つの日付の差(日数)を返すには、次のようにします。

function GetDateDiff(startDate, endDate)
{
    return endDate.getDate() - startDate.getDate();
}

最後に、最初の関数を変更して、2番目の関数から返された値をパラメーターとして取得できるようにします。

function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}

31
GetDateDiff()月の壁を越えます。たとえば、2011/04/26と2011/05/01は-25を返しますが、オフセットは5日である必要があります。
nfm

var ds = new Date(2014、0、31、0、0、0、0); var de = new Date(2014、2、31、0、0、0、0); GetDateDiff(ds、de)return 0
Noor

3

@Vincent Robertに感謝しますnewBegin + oldEnd - oldBegin。実際にはそうですが、基本的な例を使用してしまいました。簡略化された最終ソリューションは次のとおりです。

    // don't update end date if there's already an end date but not an old start date
    if (!oldEnd || oldBegin) {
        var selectedDateSpan = 1800000; // 30 minutes
        if (oldEnd) {
            selectedDateSpan = oldEnd - oldBegin;
        }

       newEnd = new Date(newBegin.getTime() + selectedDateSpan));
    }

1
なぜ使用しているのか、使用getTimeしていないのかを説明するのは良いことです
Dan

2

必要に応じて、この関数は2日間の差を計算し、10進数の日数で結果を返します。

// This one returns a signed decimal. The sign indicates past or future.

this.getDateDiff = function(date1, date2) {
    return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
}

// This one always returns a positive decimal. (Suggested by Koen below)

this.getDateDiff = function(date1, date2) {
    return Math.abs((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
}

1
それを置きMath.abs()呼び出し、あなたは常に正の小数を取得します。
公園。

1
いい提案公園。それは人々に2つのオプションを与えます:あなたが提案した通りの真の日付の違い、または違いが過去か未来かを示す記号の付いたdatediffです。:)
sparkyspider

JavaScriptでは、ミリ秒単位で数値を加算/減算してdate.getTime()、将来/過去の時間を取得することもできます。`var nextMinute = new Date(someDate.getTime()+ 60 * 1000);
ダン

これはタイプミスですか?「2日の間」。おそらく2つの日付の間。
tomazahlin


1
function compare()
{
  var end_actual_time    = $('#date3').val();

  start_actual_time = new Date();
  end_actual_time = new Date(end_actual_time);

  var diff = end_actual_time-start_actual_time;

  var diffSeconds = diff/1000;
  var HH = Math.floor(diffSeconds/3600);
  var MM = Math.floor(diffSeconds%3600)/60;

  var formatted = ((HH < 10)?("0" + HH):HH) + ":" + ((MM < 10)?("0" + MM):MM)
  getTime(diffSeconds);
}
function getTime(seconds) {
  var days = Math.floor(leftover / 86400);

  //how many seconds are left
  leftover = leftover - (days * 86400);

  //how many full hours fits in the amount of leftover seconds
  var hours = Math.floor(leftover / 3600);

  //how many seconds are left
  leftover = leftover - (hours * 3600);

  //how many minutes fits in the amount of leftover seconds
  var minutes = leftover / 60;

  //how many seconds are left
  //leftover = leftover - (minutes * 60);
  alert(days + ':' + hours + ':' + minutes);
}

1

代替変更拡張コード..

http://jsfiddle.net/vvGPQ/48/

showDiff();

function showDiff(){
var date1 = new Date("2013/01/18 06:59:00");   
var date2 = new Date();
//Customise date2 for your required future time

var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));

var years = Math.floor(diff/(365*24*60*60));
var leftSec = diff - years * 365*24*60*60;

var month = Math.floor(leftSec/((365/12)*24*60*60));
var leftSec = leftSec - month * (365/12)*24*60*60;    

var days = Math.floor(leftSec/(24*60*60));
var leftSec = leftSec - days * 24*60*60;

var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;

var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;




document.getElementById("showTime").innerHTML = "You have " + years + " years "+ month + " month " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds the life time has passed.";

setTimeout(showDiff,1000);
}

回答をさらに明確にして、より良い英語を使用してください。
モニカの訴訟に資金を提供

うるう年を無視して365日を使用するため、このソリューションは間違っています。
Sergey Goliney 2017

0
function checkdate() {
    var indate = new Date()
    indate.setDate(dat)
    indate.setMonth(mon - 1)
    indate.setFullYear(year)

    var one_day = 1000 * 60 * 60 * 24
    var diff = Math.ceil((indate.getTime() - now.getTime()) / (one_day))
    var str = diff + " days are remaining.."
    document.getElementById('print').innerHTML = str.fontcolor('blue')
}

0
<html>
<head>
<script>
function dayDiff()
{
     var start = document.getElementById("datepicker").value;
     var end= document.getElementById("date_picker").value;
     var oneDay = 24*60*60*1000; 
     var firstDate = new Date(start);
     var secondDate = new Date(end);    
     var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    document.getElementById("leave").value =diffDays ;
 }
</script>
</head>
<body>
<input type="text" name="datepicker"value=""/>
<input type="text" name="date_picker" onclick="function dayDiff()" value=""/>
<input type="text" name="leave" value=""/>
</body>
</html>

0

このコードは、調査の開始日と終了日(資格取得日)を入力したときに調査年の期間を入力し、期間が1年未満であるかどうかを確認します。期間が1年未満の場合は、メッセージで注意するアラートに最初の3つの入力要素がtxtFromQualifDateあり、 2番目txtQualifDateと3番目txtStudyYears

年数の結果を端数で表示します

function getStudyYears()
    {
        if(document.getElementById('txtFromQualifDate').value != '' && document.getElementById('txtQualifDate').value != '')
        {
            var d1 = document.getElementById('txtFromQualifDate').value;

            var d2 = document.getElementById('txtQualifDate').value;

            var one_day=1000*60*60*24;

            var x = d1.split("/");
            var y = d2.split("/");

            var date1=new Date(x[2],(x[1]-1),x[0]);

            var date2=new Date(y[2],(y[1]-1),y[0])

            var dDays = (date2.getTime()-date1.getTime())/one_day;

            if(dDays < 365)
            {
                alert("the date between start study and graduate must not be less than a year !");

                document.getElementById('txtQualifDate').value = "";
                document.getElementById('txtStudyYears').value = "";

                return ;
            }

            var dMonths = Math.ceil(dDays / 30);

            var dYears = Math.floor(dMonths /12) + "." + dMonths % 12;

            document.getElementById('txtStudyYears').value = dYears;
        }
    }

1
文字列の表示(特にセパレータ)はブラウザによって異なるため、日付文字列を解析して年を見つけることはありません。getFullYearそのために設計された使用。-------ほとんどのコーナーケースをサポートする可能性があるgooglecodeのdatejsライブラリを参照してください
Dan

@Danの助言に感謝しますが、実際の政府プロジェクト(異なるブラウザー)で動作し、テストされましたが、その弱いプログラミングは積極的ですか :)
シェアリーフ2013

0

Dateオブジェクトを使用し、getTime()両方の日付に関数を使用すると、1970年1月1日からのそれぞれの時刻が数値で表示されます。その後、これらの数値の違いを取得できます。

それでも解決しない場合は、完全なドキュメントを確認してくださいhttp : //www.w3schools.com/jsref/jsref_obj_date.asp


ああ、いや、気づかなかった、これ以下の答えはせいぜい半年前のものだ。
公園。

0

以下のコードは、今日から先物までの残り日数を返します。

依存関係:jQueryおよびMomentJs。

var getDaysLeft = function (date) {
  var today = new Date();
  var daysLeftInMilliSec = Math.abs(new Date(moment(today).format('YYYY-MM-DD')) - new Date(date));
  var daysLeft = daysLeftInMilliSec / (1000 * 60 * 60 * 24);   
  return daysLeft;
};

getDaysLeft('YYYY-MM-DD');

0
var getDaysLeft = function (date1, date2) {
   var daysDiffInMilliSec = Math.abs(new Date(date1) - new Date(date2));
   var daysLeft = daysDiffInMilliSec / (1000 * 60 * 60 * 24);   
   return daysLeft;
};
var date1='2018-05-18';
var date2='2018-05-25';
var dateDiff = getDaysLeft(date1, date2);
console.log(dateDiff);

0

これが私のシステムで行ったことです。

var startTime=("08:00:00").split(":");
var endTime=("16:00:00").split(":");
var HoursInMinutes=((parseInt(endTime[0])*60)+parseInt(endTime[1]))-((parseInt(startTime[0])*60)+parseInt(startTime[1]));
console.log(HoursInMinutes/60);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.