Cara menghitung jumlah hari antara dua tanggal


283

Saya memiliki dua tanggal input yang diambil dari kontrol Date Picker. Saya telah memilih tanggal mulai 2/2/2012 dan tanggal akhir 2/7/2012. Saya telah menulis kode berikut untuk itu.

Saya harus mendapatkan hasil sebagai 6 tetapi saya mendapatkan 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);
}

Adakah yang bisa memberitahu saya bagaimana saya bisa mendapatkan perbedaan yang tepat?


mengapa Anda mendapatkan hasil = 6 ??? 07 - 02 = 05 hari ....
André Alçada Padez

1
Tetapi rentang hari dari 2 hingga 7 adalah 2,3,4,5,6,7 = 6 hari.
Sup

Sambil mengambil perbedaan saya ingin mempertimbangkan tanggal Mulai juga ....
Vaibhav Deshmukh

17
Nah ... kenapa tidak tambahkan saja 1 jawaban?
Runcing

Masalahnya (jika ada masalah sama sekali) fungsional, bukan teknis. @Pointy comment adalah jawabannya. Itu sebabnya beberapa orang bertanya mengapa kita berada di abad XXI.
Leandro

Jawaban:


667

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

Dari Momen docs:

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

atau untuk memasukkan awal:

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

Ketukan mengotak-atik cap waktu dan zona waktu secara manual.

Tergantung pada kasus penggunaan khusus Anda, Anda dapat melakukannya

  1. Gunakan a/b.startOf('day')dan / atau a/b.endOf('day')untuk memaksa diff untuk menjadi inklusif atau eksklusif di "ujung" (seperti yang disarankan oleh @kotpal di komentar).
  2. Tetapkan argumen ketiga trueuntuk mendapatkan diff titik mengambang yang Anda bisa Math.floor, Math.ceilatau Math.roundsesuai kebutuhan.
  3. Opsi 2 juga dapat dicapai dengan mendapatkan 'seconds'alih-alih 'days'lalu membaginya dengan 24*60*60.

30
moment.js akan memberikan nilai negatif jika a <b. Jadi, perhitungan yang lebih kuat adalah: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni

18
Berhati-hatilah untuk mengabaikan bagian waktu - atau Anda akan mendapatkan hasil yang berbeda untuk tanggal yang sama tetapi dengan waktu yang berbeda (seperti dari kontrol pemilih tanggal). gunakan moment (someDate) .startOf ('day') untuk secara eksplisit mengatur part time ke 00:00:00 sebelum melakukan diff (atau operasi lain yang sensitif terhadap time-part dari objek Date / moment)
kotpal

Ini berfungsi tetapi tidak memperhitungkan komponen waktu. Mencoba membedakan antara dua pasangan berikut: (a = "2017-12-24T00: 00: 00Z" dan "b = 2017-12-31T23: 59: 59Z") dan (a = "2017-12-24T23: 00 : 00Z "dan b =" 2017-12-31T23: 59: 59Z "). return b.diff (a, 'days') <= 7; keduanya kembali benar. Apakah ada cara untuk memasukkan komponen waktu dalam diff?
Roobie

1
+1 untuk startOf () dan endOf (). Saya telah menggunakan perpustakaan ini selama beberapa tahun dan tidak pernah melihatnya sebelumnya. Saya selalu memberi +1.
Mike Devenney

3
Ketahuilah bahwa startOfsaat ini bermutasi. Jika Anda tidak menginginkannya, maka lakukanlah a.clone().startOf('day').diff(b.clone().startOf('day')).
HRJ

53

Jika Anda menggunakan moment.js, Anda dapat melakukannya dengan mudah.

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

Jika Anda ingin menemukan perbedaan antara tanggal yang diberikan dan tanggal saat ini dalam jumlah hari (mengabaikan waktu), pastikan untuk menghapus waktu dari objek saat dari tanggal saat ini seperti di bawah ini

moment().startOf('day')

Untuk menemukan perbedaan antara tanggal yang diberikan dan tanggal saat ini dalam jumlah hari

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 () mengembalikan saya beberapa nilai dengan desimal. Saya menggunakan current.diff(given, 'days')jadi itu mengumpulkan.
Vincent

@Vincent tampaknya Anda menggunakan ini dengan cara yang salah. ini jelas solusi yang lebih bersih hasilnya benar dibandingkan dengan jawaban @Supr di mana a 1hilang
Nwawel A Iroume

15

Mencoba:

//Difference in days

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

Saya pikir itu pada dasarnya benar tetapi bukankah pada dasarnya sama dengan apa yang ada di OP?
Runcing

Karena cara dia menulisnya, aku tidak menyadarinya, tapi ya, cukup banyak! : P
Richard

5
Saya tidak suka angka ajaib .. akan lebih baik jika angka itu dipecah menjadi persamaan penjelasan sendiri
vsync

7

Coba ini Menggunakan moment.js (Cukup mudah untuk menghitung operasi tanggal dalam javascript)

firstDate.diff (secondDate, 'days', false); // true | false untuk nilai pecahan

Hasil akan memberi Anda jumlah hari dalam bilangan bulat.


di sini adalah tanda tangan: moment (). diff (Moment | String | Number | Date | Array, String, Boolean);
Sumit

1

Anda juga dapat menggunakan kode ini: moment ("yourDateHere", "YYYY-MM-DD"). FromNow (). Ini akan menghitung perbedaan antara hari ini dan tanggal yang Anda berikan.


1

Ini bekerja untuk saya:

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

Saya membuat fungsi yang dapat digunakan kembali dengan cepat di ES6 menggunakan 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 saya punya dua input teks 1: jumlah hari 2: datetime picker

 @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

untuk menghitung angka dari penggunaan tanggal

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

untuk menghitung jumlah hari antara dua tanggal digunakan

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

jangan lupa untuk menambahkan http://momentjs.com/

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.