İki tarih arasındaki gün sayısı nasıl hesaplanır


282

Tarih Seçici denetiminden alınan iki giriş tarihim var. Başlangıç ​​tarihi 2/2/2012 ve bitiş tarihi 2/7/2012 seçtim. Bunun için aşağıdaki kodu yazdım.

6 olarak sonuç almalıyım ama 5 alıyorum.

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);
}

Birisi bana tam olarak nasıl fark yaratabileceğimi söyleyebilir mi?


neden sonuç = 6 ??? 07 - 02 = 05 gün ....
André Alçada Padez

1
Ancak 2'den 7'ye kadar olan günler aralığı 2,3,4,5,6,7 = 6 gündür.
Supr

Fark alırken Başlangıç ​​tarihini de göz önünde bulundurmak istiyorum ....
Vaibhav Deshmukh

17
Peki ... neden cevaba sadece 1 eklemiyoruz?
Pointy

Sorun (hiç bir sorun varsa) teknik değil işlevseldir. @Pointy yorumu cevaptır. Bu yüzden bazı insanlar neden XXI yüzyılda olduğumuzu soruyor.
Leandro

Yanıtlar:


666

http://momentjs.com/ veya https://date-fns.org/

Moment dokümanlarından:

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

veya başlangıcı eklemek için:

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

Zaman damgaları ve zaman dilimleri ile karışıklığı manuel olarak yener.

Özel kullanım durumunuza bağlı olarak,

  1. Farkı "uçlarda" kapsayıcı veya münhasır olmaya zorlamak için a/b.startOf('day')ve / veya kullanın a/b.endOf('day')(yorumlarda @kotpal tarafından önerildiği gibi).
  2. Set üçüncü argüman truesonra bir kayan nokta diff almak için Math.floor, Math.ceilya da Math.roundgerektiği gibi.
  3. Seçenek 2, 'seconds'yerine 'days'alıp sonra da bölerek de gerçekleştirilebilir 24*60*60.

30
moment.js, <b ise negatif değer verecektir. Yani, daha sağlam hesaplama olurdu: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni

18
Zaman bölümünü göz ardı etmeyi unutmayın - yoksa aynı tarih için ancak farklı zamanlarda farklı sonuçlar alırsınız (tarih seçici denetiminden olduğu gibi). diff (veya Date / moment nesnesinin time-
part'e

Bu çalışır, ancak zaman bileşenini dikkate almaz. Aşağıdaki iki çift arasında farklılık göstermeye çalışıyorum: (a = "2017-12-24T00: 00: 00Z" ve "b = 2017-12-31T23: 59: 59Z") ve (a = "2017-12-24T23: 00 : 00Z "ve b =" 2017-12-31T23: 59: 59Z "). dönüş b.diff (a, 'günler) <= 7; her ikisi de doğrudur. Farkdaki zaman bileşenini dahil etmenin bir yolu var mı?
Roobie

1
StartOf () ve endOf () için +1. Bu kütüphaneyi birkaç yıldır kullandım ve daha önce hiç fark etmedim. Her zaman +1 yaptım.
Mike Devenney

3
startOfAnı değiştirdiğinin farkında olun . Bunu istemiyorsanız, yapın a.clone().startOf('day').diff(b.clone().startOf('day')).
HRJ

53

Moment.js kullanıyorsanız bunu kolayca yapabilirsiniz.

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();

Belirli bir tarih ile geçerli tarih arasındaki gün sayısı (zaman yoksayılıyor) arasındaki farkı bulmak istiyorsanız, geçerli tarihin moment nesnesinden zamanı aşağıdaki gibi kaldırdığınızdan emin olun.

moment().startOf('day')

Belirli bir tarih ile şu anki tarih arasındaki gün sayısı arasındaki farkı bulmak için

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 () bana ondalık sayılarla bazı değerler verdi. Kullandığım current.diff(given, 'days')o kadar yuvarlar yüzden.
Vincent

@Vincent bunu yanlış şekilde kullanıyor gibi görünüyor. Bu, a'nın 1kaybolduğu @Supr cevabına kıyasla sonuçun daha temiz bir çözüm olduğu kesin
Nwawel A Iroume

15

Deneyin:

//Difference in days

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

Bence bu temelde doğru ama OP'deki ile aynı değil mi?
Pointy

Yazma şekli nedeniyle fark etmedim, ama evet, hemen hemen! : P
Richard

5
Sihirli sayılardan hoşlanmıyorum .. Bu sayının açıklayıcı bir denkleme
bölünmesi

7

Moment.js'yi kullanarak deneyin (Javascript'te tarih işlemlerini hesaplamak oldukça kolaydır)

firstDate.diff (secondDate, 'günler, yanlış); // true | kesir değeri için false

Sonuç size tamsayı olarak gün sayısını verecektir.


İşte imza: moment (). diff (Moment | String | Number | Date | Array, String, Boolean);
Sumit

1

Ayrıca şu kodu da kullanabilirsiniz: moment ("yourDateHere", "YYYY-AA-GG"). FromNow (). Bu, bugün ile sağladığınız tarih arasındaki farkı hesaplar.


1

Bu benim için çalışıyor:

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

Moment.js kullanarak ES6'da yeniden kullanılabilir bir işlev yaptım.

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 iki giriş metni 1 var: 2. gün sayısı: datetime seçici

 @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

tarih kullanımından sayı hesaplamak için

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

iki tarih arasındaki gün sayısını hesaplamak için

  $("#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/ adresini eklemeyi unutmayın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.