2つの日付間の日数を計算する方法


282

Date Pickerコントロールから取得した2つの入力日付があります。開始日2012年2月2日と終了日2012年2月7日を選択しました。そのために次のコードを書きました。

6として結果を取得する必要がありますが、5を取得しています。

function SetDays(invoker) {   
    var start = $find('<%=StartWebDatePicker.ClientID%>').get_value();
    var end = $find('<%=EndWebDatePicker.ClientID%>').get_value();

    var oneDay=1000 * 60 * 60 * 24;
    var difference_ms = Math.abs(end.getTime() - start.getTime())
    var diffValue = Math.round(difference_ms / oneDay);
}

正確な違いを得る方法を誰かに教えてもらえますか?


なぜ結果= 6を取得する必要があるのですか?07から02 = 05日....
アンドレAlçadaPadez

1
ただし、2〜7日の範囲は2、3、4、5、6、7 = 6日です。
2012

違いを取りながら、私も開始日を検討したいと思います...
Vaibhav Deshmukh

17
さて...なぜ答えに1を加えないのですか?
先のとがった

問題(問題がある場合)は機能的であり、技術的ではありません。@Pointyコメントが答えです。それが、なぜ私たちがXXI世紀にいるのかと尋ねる人々がいる理由です。
Leandro

回答:


666

http://momentjs.com/または https://date-fns.org/

Moment docsから:

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

または開始を含める:

a.diff(b, 'days')+1   // =2

手動でタイムスタンプとタイムゾーンをいじるビート。

特定のユースケースに応じて、次のいずれかを行うことができます

  1. (コメントの@kotpalによって示唆されているように)使用してa/b.startOf('day')、および/またはa/b.endOf('day')差分を「終了」で包括的または排他的にします。
  2. 3番目の引数trueを設定して、浮動小数点のdiffを取得します。これはMath.floorMath.ceilまたはMath.round必要に応じて実行できます。
  3. オプション2は、の'seconds'代わりに'days'を取得してから、で割ることによっても実現でき24*60*60ます。

30
a。<bの場合、moment.jsは負の値を返します。だから、より堅牢な計算は次のようになります Math.abs(a.diff(b, 'days'))+1
ビナイサーニ

18
時間部分を無視するように注意してください。そうしないと、同じ日付でも異なる結果が得られます(日付ピッカーコントロールなど)。差分(または日付/モーメントオブジェクトの時間部分に敏感なその他の操作)を実行する前に、moment(someDate).startOf( 'day')を使用して時間部分を明示的に00:00:00に設定します
kotpal

これは機能しますが、時間コンポーネントは考慮されません。次の2つのペアを比較しようとしています:(a = "2017-12-24T00:00:00Z"および "b = 2017-12-31T23:59:59Z")および(a = "2017-12-24T23:00 :00Z "およびb =" 2017-12-31T23:59:59Z ")。return b.diff(a、 'days')<= 7; どちらもtrueを返します。時間コンポーネントを差分に含める方法はありますか?
Roobie 2017年

1
startOf()およびendOf()の+1。私はこのライブラリーを数年間使用しており、以前はそれらに気づかなかった。私はいつも+1をしました。
Mike Devenney

3
startOf瞬間が変化することに注意してください。それが必要ない場合は、実行してくださいa.clone().startOf('day').diff(b.clone().startOf('day'))
HRJ

53

moment.jsを使用している場合は、簡単に実行できます。

var start = moment("2018-03-10", "YYYY-MM-DD");
var end = moment("2018-03-15", "YYYY-MM-DD");

//Difference in number of days
moment.duration(start.diff(end)).asDays();

//Difference in number of weeks
moment.duration(start.diff(end)).asWeeks();

特定の日付と現在の日付の差異を日数で(時間を無視して)見つけたい場合は、以下のように現在の日付のモーメントオブジェクトから時間を削除してください。

moment().startOf('day')

指定した日付と現在の日付の日数の違いを見つけるには

var given = moment("2018-03-10", "YYYY-MM-DD");
var current = moment().startOf('day');

//Difference in number of days
moment.duration(given.diff(current)).asDays();

2
asDays()は小数を含むいくつかの値を返しました。current.diff(given, 'days')切り上げるので使います。
ビンセント

@Vincentはあなたがこれを間違った方法で使用しているようです。これは、a 1が失われる@Suprの回答と比較して、結果が正しいより間違いなくよりクリーンなソリューションです
Nwawel A Iroume

15

試してください:

//Difference in days

var diff =  Math.floor(( start - end ) / 86400000);
alert(diff);

基本的には正しいと思いますが、基本的にはOPの内容と同じではありませんか?
先のとがった

彼の書いた方法に気づかなかったが、そうだ!:P
リチャード

5
マジックナンバーは好きではありません。そのナンバーが自明の方程式に分解された方がいいでしょう
vsync

7

moment.jsを使用してこれを試してください(JavaScriptで日付操作を計算するのは非常に簡単です)

firstDate.diff(secondDate、 'days'、false); //小数値の場合はtrue | false

結果は整数で日数を与えます。


これが署名です:moment()。diff(Moment | String | Number | Date | Array、String、Boolean);
スミット

1

また、次のコードを使用できます:moment( "yourDateHere"、 "YYYY-MM-DD")。fromNow()。これにより、今日と指定した日付の差が計算されます。


1

これは私にとってはうまくいきます:

const from = '2019-01-01';
const to   = '2019-01-08';

Math.abs(
    moment(from, 'YYYY-MM-DD')
      .startOf('day')
      .diff(moment(to, 'YYYY-MM-DD').startOf('day'), 'days')
  ) + 1
);


1

ES6でMoment.jsを使用して、すばやく再利用できる関数を作成しました。

const getDaysDiff = (start_date, end_date, date_format = 'YYYY-MM-DD') => {
  const getDateAsArray = (date) => {
    return moment(date.split(/\D+/), date_format);
  }
  return getDateAsArray(end_date).diff(getDateAsArray(start_date), 'days') + 1;
}

console.log(getDaysDiff('2019-10-01', '2019-10-30'));
console.log(getDaysDiff('2019/10/01', '2019/10/30'));
console.log(getDaysDiff('2019.10-01', '2019.10 30'));
console.log(getDaysDiff('2019 10 01', '2019 10 30'));
console.log(getDaysDiff('+++++2019!!/###10/$$01', '2019-10-30'));
console.log(getDaysDiff('2019-10-01-2019', '2019-10-30'));
console.log(getDaysDiff('10-01-2019', '10-30-2019', 'MM-DD-YYYY'));

console.log(getDaysDiff('10-01-2019', '10-30-2019'));
console.log(getDaysDiff('10-01-2019', '2019-10-30', 'MM-DD-YYYY'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>


-1

MVC iには2つの入力テキストがあります1:日数2:日時ピッカー

 @Html.TextBox("HeaderINVID", null, new { @id = "HeaderINVID", @type = "number", @class = "form-control", autocomplete = "off", placeholder = "Day Count " })

  @Html.TextBox("HeaderINVDT", null, new { id = "HeaderINVDT", @class = "form-control format-picker", autocomplete = "off", placeholder = " Date" })

javascipt

日付の使用から数を計算する

    $("#HeaderINVID").bind("keyup", function (e) {
        var INVID = $("#HeaderINVID").val();
        var date = moment()
            .add(INVID, 'd')
            .toDate(); 
        $("#HeaderINVDT").val(moment(date).format('YYYY-MM-DD')) ;
    })

2つの日付間の日数を計算するには

  $("#HeaderINVDT").bind('change', function (e) {
        var StDT = moment($("#HeaderINVDT").val()).startOf('day');
        var NODT = moment().startOf('day');
        $("#HeaderINVID").val(StDT.diff(NODT, 'days'));
    })

http://momentjs.com/を追加することを忘れないで ください

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