web-dev-qa-db-ja.com

JavaScriptで2つの日付の違いを見ますか?

1日のうちの2つの日付の差を取得するにはどうすればよいですか(1日の端数は不要です)

var date1 = new Date('7/11/2010');
var date2 = new Date('12/12/2010');
var diffDays = date2.getDate() - date1.getDate(); 
alert(diffDays)

私は上記を試したが、これはうまくいきませんでした。

440
chobo2

これは一方通行です

const date1 = new Date('7/13/2010');
const date2 = new Date('12/15/2010');
const diffTime = Math.abs(date2.getTime() - date1.getTime());
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); 
console.log(diffDays);

日付を引用符で囲む必要があることに注意してください。コードの残りの部分はミリ秒単位で時差を取得してから日数を取得するために分割します。日付はmm/dd/yyyy形式を想定しています。

674
TNi

より正しい解決策

... 日付は当然タイムゾーン情報を持っているため、さまざまな日中の節電調整が行われている地域にまたがることがあります

この質問に対する以前の回答では、問題の2つの日付が夏時間(DST)の変更にまたがる場合は説明されていません。 DSTの変更が行われた日付のミリ秒単位の期間は!= 1000*60*60*24なので、通常の計算は失敗します。

これを回避するには、まず2つの日付をUTCに正規化してから、それら2つのUTC日付間の差を計算します。

さて、解は次のように書くことができます。

const _MS_PER_DAY = 1000 * 60 * 60 * 24;

// a and b are javascript Date objects
function dateDiffInDays(a, b) {
  // Discard the time and time-zone information.
  const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
  const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());

  return Math.floor((utc2 - utc1) / _MS_PER_DAY);
}

// test it
const a = new Date("2017-01-01"),
    b = new Date("2017-07-25"),
    difference = dateDiffInDays(a, b);

これは、UTC時間がDSTを監視しないために機能します。 を参照してください。UTCは夏時間を守っていますか?

p.s.この回答に対するいくつかのコメントについて議論した後、DSTの境界にまたがるJavaScriptの日付に関する問題を理解したら、それを解決するための方法が複数ある可能性があります。私が上で提供したものは単純な(そしてテストされた)解決策です。 2つの新しいDateオブジェクトをインスタンス化する代わりに、単純な算術/数学ベースのソリューションがあるかどうかを知りたいと思います。それは潜在的に速くなる可能性があります。

631

これは moment.js を使った解決策です:

var a = moment('7/11/2010','M/D/YYYY');
var b = moment('12/12/2010','M/D/YYYY');
var diffDays = b.diff(a, 'days');
alert(diffDays);

元の入力値を使用しましたが、形式を指定しなかったため、最初の値は7月11日であると想定しました。 11月7日を予定している場合は、代わりにフォーマットをD/M/YYYYに調整してください。

71
Matt Johnson
var date1 = new Date("7/11/2010");
var date2 = new Date("8/11/2010");
var diffDays = parseInt((date2 - date1) / (1000 * 60 * 60 * 24)); 

alert(diffDays )
27
volkan er

私はいろいろな方法を試してみましたが、datepickerを使用するのが最善であることがわかりました、しかし日付フォーマットはJavaScriptに関する問題を引き起こします。

だからここに私の答えがあり、箱から出して実行することができます。

<input type="text" id="startdate">
<input type="text" id="enddate">
<input type="text" id="days">

<script src="https://code.jquery.com/jquery-1.8.3.js"></script>
<script src="https://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/redmond/jquery-ui.css" />
<script>
$(document).ready(function() {

$( "#startdate,#enddate" ).datepicker({
changeMonth: true,
changeYear: true,
firstDay: 1,
dateFormat: 'dd/mm/yy',
})

$( "#startdate" ).datepicker({ dateFormat: 'dd-mm-yy' });
$( "#enddate" ).datepicker({ dateFormat: 'dd-mm-yy' });

$('#enddate').change(function() {
var start = $('#startdate').datepicker('getDate');
var end   = $('#enddate').datepicker('getDate');

if (start<end) {
var days   = (end - start)/1000/60/60/24;
$('#days').val(days);
}
else {
alert ("You cant come back before you have been!");
$('#startdate').val("");
$('#enddate').val("");
$('#days').val("");
}
}); //end change function
}); //end ready
</script>

a Fiddleはここで見ることができます _ demo _

11
Mikeys4u

これはある日付から別の日付を引くためのコードです。この例では、getTime()関数はDateオブジェクトでないと機能しないため、日付をオブジェクトに変換します。

    var dat1 = document.getElementById('inputDate').value;
                var date1 = new Date(dat1)//converts string to date object
                alert(date1);
                var dat2 = document.getElementById('inputFinishDate').value;
                var date2 = new Date(dat2)
                alert(date2);

                var oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds
                var diffDays = Math.abs((date1.getTime() - date2.getTime()) / (oneDay));
                alert(diffDays);
2
Pec1983