Bagaimana cara saya mendapatkan jumlah hari antara dua tanggal dalam JavaScript?

403

Bagaimana cara saya mendapatkan jumlah hari antara dua tanggal dalam JavaScript? Misalnya, diberi dua tanggal dalam kotak input:

<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>
Michael Haren
sumber
5
99% kasus di mana pengguna meminta "jumlah hari antara dua tanggal" yang tidak dia pahami adalah bahwa dia mencoba membandingkan apel dengan pir. Masalahnya menjadi sangat sederhana jika ditanya "Berapa banyak DATES yang ada dalam RANGE DATE?", Atau berapa banyak kotak yang harus saya lewati di kalender. Hal ini membuat masalah penghematan waktu dan siang hari dll. Kebingungan tersirat pada kami karena struktur data datetime yang murni omong kosong. Tidak ada yang namanya datetime ada tanggal dan ada waktu, dua objek yang sangat berbeda dalam sifat dan perilaku
Mihail Shishkov
Untuk fungsi yang membagi perbedaan menjadi satuan waktu, gunakan jawabannya di stackoverflow.com/a/53092438/3787376 .
Edward
Saya merasa pertanyaan ini harus dihapus atau setidaknya ditandai "dihindari" karena sebagian besar jawabannya salah atau bergantung pada berbagai perpustakaan.
RobG

Jawaban:

409

Berikut ini adalah implementasi cepat dan kotordatediff , sebagai bukti konsep untuk menyelesaikan masalah seperti yang disajikan dalam pertanyaan. Itu bergantung pada fakta bahwa Anda bisa mendapatkan milidetik yang telah berlalu antara dua tanggal dengan mengurangkannya, yang memaksa mereka menjadi nilai angka primitif mereka (milidetik sejak awal 1970).

// new Date("dateString") is browser-dependent and discouraged, so we'll write
// a simple parse function for U.S. date format (which does no error checking)
function parseDate(str) {
    var mdy = str.split('/');
    return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

function datediff(first, second) {
    // Take the difference between the dates and divide by milliseconds per day.
    // Round to nearest whole number to deal with DST.
    return Math.round((second-first)/(1000*60*60*24));
}

alert(datediff(parseDate(first.value), parseDate(second.value)));
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

Anda harus menyadari bahwa "Date" API Tanggal (tanpa "UTC" dalam nama) beroperasi di zona waktu lokal browser pengguna, jadi secara umum Anda dapat mengalami masalah jika pengguna Anda berada di zona waktu yang tidak Anda miliki. harapkan, dan kode Anda harus berurusan dengan transisi Daylight Saving Time. Anda harus hati-hati membaca dokumentasi untuk objek Date dan metodenya, dan untuk hal yang lebih rumit, sangat mempertimbangkan menggunakan perpustakaan yang menawarkan API yang lebih aman dan kuat untuk manipulasi tanggal.

Juga, untuk tujuan ilustrasi, potongan menggunakan akses bernama pada windowobjek untuk singkatnya, tetapi dalam produksi Anda harus menggunakan API standar seperti getElementById , atau lebih mungkin, beberapa kerangka UI.

Miles
sumber
2
Saya pikir Math.trunc () lebih tepat. Untuk berjaga-jaga jika seseorang menggunakan objek Date yang lebih tepat (yaitu termasuk jam, menit, dan detik)
Jin Wang
21
Karena jawaban yang ditandai dengan benar dan pilihan tertinggi (seperti sekarang), ada baiknya berkomentar bahwa jawaban ini tidak benar menangani Waktu Musim Panas. Lihat jawaban Michael Liu sebagai gantinya.
osullic
Apa yang dilakukan parseDate sebenarnya?
Mohammad Kermani
2
@ osullic — jawaban ini menangani daylight saving dengan Math.round , namun diharapkan hanya akan diberikan string tanggal, bukan tanggal dan waktu.
RobG
2
Ingat saja bahwa tanggal dalam format AS dalam contoh ini, yaitu MM / DD / YYYY. Jika Anda memerlukan versi Inggris, maka Anda perlu mengubah parseDatemetode menjadi:return new Date(mdy[2], mdy[1], mdy[0]-1);
Viqas
207

Pada tulisan ini, hanya satu dari jawaban lain yang dengan benar menangani transisi DST (waktu musim panas). Berikut adalah hasil pada sistem yang berlokasi di California:

                                        1/1/2013- 3/10/2013- 11/3/2013-
User       Formula                      2/1/2013  3/11/2013  11/4/2013  Result
---------  ---------------------------  --------  ---------  ---------  ---------
Miles                   (d2 - d1) / N   31        0.9583333  1.0416666  Incorrect
some         Math.floor((d2 - d1) / N)  31        0          1          Incorrect
fuentesjr    Math.round((d2 - d1) / N)  31        1          1          Correct
toloco     Math.ceiling((d2 - d1) / N)  31        1          2          Incorrect

N = 86400000

Meskipun Math.roundmengembalikan hasil yang benar, saya pikir itu agak kikuk. Alih-alih, dengan secara eksplisit memperhitungkan perubahan pada offset UTC ketika DST dimulai atau berakhir, kita dapat menggunakan aritmatika yang tepat:

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

alert(daysBetween($('#first').val(), $('#second').val()));

Penjelasan

Perhitungan tanggal JavaScript rumit karena Date objek menyimpan waktu secara internal dalam UTC, bukan waktu setempat. Misalnya, 3/10/2013 12:00 AM Waktu Standar Pasifik (UTC-08: 00) disimpan sebagai 3/10/2013 8:00 AM UTC, dan 3/11/2013 12:00 AM Pacific Daylight Time ( UTC-07: 00) disimpan sebagai 3/11/2013 07:00 UTC. Pada hari ini, tengah malam hingga tengah malam waktu setempat hanya 23 jam di UTC!

Meskipun satu hari dalam waktu setempat dapat memiliki lebih atau kurang dari 24 jam, satu hari di UTC selalu tepat 24 jam. 1 The daysBetweenMetode yang ditunjukkan di atas mengambil keuntungan dari fakta ini dengan panggilan pertama treatAsUTCuntuk menyesuaikan kedua kali lokal untuk tengah malam UTC, sebelum mengurangi dan membagi.

1. JavaScript mengabaikan lompatan detik.

Michael Liu
sumber
2
Tidak perlu menggunakan UTC, tidak apa-apa hanya mengatur jam lokal menjadi tengah malam (atau nilai yang sama untuk kedua tanggal). Hari fraksional yang diperkenalkan oleh penghematan siang hari hanya ± 0,04 paling banyak (dan di beberapa tempat kurang), sehingga melengkapi dengan Math.round . ;-) Mengandalkan konstruktor Date untuk mengurai string bukanlah ide yang baik. Jika Anda benar-benar ingin menggunakan nilai UTC, parsing menggunakan string Date.UTC(...)di tempat pertama.
RobG
2
@RobG: Seperti yang saya nyatakan dalam jawaban saya: "Meskipun Math.round mengembalikan hasil yang benar, saya pikir itu agak kikuk. Sebagai gantinya, dengan secara eksplisit memperhitungkan perubahan pada offset UTC ketika DST dimulai atau berakhir, kita dapat menggunakan aritmatika yang tepat."
Michael Liu
Sebenarnya, waktu yang Anda wakili sebagai "salah" secara teknis benar. Anda tidak mengubah DateTimes ke UTC ... Anda hanya mengubah waktu dari masing-masing DateTime untuk mendapatkan angka bulat buatan. Membulatkan bukanlah "kikuk" ... itu adalah pendekatan yang tepat di sini karena apa yang Anda lakukan di kepala Anda adalah: Anda membatasi porsi waktu (jam, menit, detik) dan hanya berusaha untuk mendapatkan keseluruhan nomor hari.
JDB masih mengingat Monica
116

Cara termudah untuk mendapatkan perbedaan antara dua tanggal:

var diff =  Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000); 

Anda mendapatkan selisih hari (atau NaN jika satu atau keduanya tidak dapat diuraikan). Tanggal parse memberikan hasilnya dalam milidetik dan untuk mendapatkannya pada hari Anda harus membaginya dengan 24 * 60 * 60 * 1000

Jika Anda ingin dibagi berdasarkan hari, jam, menit, detik, dan milidetik:

function dateDiff( str1, str2 ) {
    var diff = Date.parse( str2 ) - Date.parse( str1 ); 
    return isNaN( diff ) ? NaN : {
        diff : diff,
        ms : Math.floor( diff            % 1000 ),
        s  : Math.floor( diff /     1000 %   60 ),
        m  : Math.floor( diff /    60000 %   60 ),
        h  : Math.floor( diff /  3600000 %   24 ),
        d  : Math.floor( diff / 86400000        )
    };
}

Ini adalah versi James versi refactored saya:

function mydiff(date1,date2,interval) {
    var second=1000, minute=second*60, hour=minute*60, day=hour*24, week=day*7;
    date1 = new Date(date1);
    date2 = new Date(date2);
    var timediff = date2 - date1;
    if (isNaN(timediff)) return NaN;
    switch (interval) {
        case "years": return date2.getFullYear() - date1.getFullYear();
        case "months": return (
            ( date2.getFullYear() * 12 + date2.getMonth() )
            -
            ( date1.getFullYear() * 12 + date1.getMonth() )
        );
        case "weeks"  : return Math.floor(timediff / week);
        case "days"   : return Math.floor(timediff / day); 
        case "hours"  : return Math.floor(timediff / hour); 
        case "minutes": return Math.floor(timediff / minute);
        case "seconds": return Math.floor(timediff / second);
        default: return undefined;
    }
}
beberapa
sumber
2
Jawaban yang buruk Math.floor () akan kehilangan Anda sehari ketika jam maju dalam penghematan siang hari. Math.round () akan memberikan jawaban yang benar di sebagian besar situasi tetapi ada opsi yang lebih baik di jawaban lain juga.
Phil B
101

Saya sarankan menggunakan perpustakaan moment.js ( http://momentjs.com/docs/#/displaying/difference/ ). Ini menangani waktu musim panas dengan benar dan secara umum bagus untuk digunakan.

Contoh:

var start = moment("2013-11-03");
var end = moment("2013-11-04");
end.diff(start, "days")
1
stephenbez
sumber
10
Sama seperti sebuah peringatan sementara momentjs hebat, itu juga ketergantungan yang sangat besar
Jason Axelson
Seharusnya benar-benar end.diff(start,"days")walaupun kode yang ditulis akan bekerja karena tanggal mulai setelah tanggal akhir!
gordon613
40

Saya akan pergi ke depan dan mengambil utilitas kecil ini dan di dalamnya Anda akan menemukan fungsi untuk ini untuk Anda. Ini contoh singkatnya:

        <script type="text/javascript" src="date.js"></script>
        <script type="text/javascript">
            var minutes = 1000*60;
            var hours = minutes*60;
            var days = hours*24;

            var foo_date1 = getDateFromFormat("02/10/2009", "M/d/y");
            var foo_date2 = getDateFromFormat("02/12/2009", "M/d/y");

            var diff_date = Math.round((foo_date2 - foo_date1)/days);
            alert("Diff date is: " + diff_date );
        </script>
fuentesjr
sumber
28
const startDate = '2017-11-08';
const endDate   = '2017-10-01';
const timeDiff  = (new Date(startDate)) - (new Date(endDate));
const days      = timeDiff / (1000 * 60 * 60 * 24)
  1. Tetapkan tanggal mulai
  2. Tetapkan tanggal akhir
  3. Hitung perbedaannya
  4. Ubah milidetik menjadi hari

Pembaruan: Saya tahu ini bukan bagian dari pertanyaan Anda, tetapi secara umum saya tidak akan merekomendasikan untuk melakukan perhitungan tanggal atau manipulasi dalam vanilla JavaScript dan lebih suka menggunakan perpustakaan seperti date-fns atau moment.js untuk itu karena banyak kasus tepi.

marcobiedermann
sumber
5
Saya menghargai jawaban seperti ini: singkat, sederhana dan tidak ada ketergantungan acak yang diperlukan! Bersulang.
DaCoda
2
Apakah hanya saya yang telah timeDiffkembali dalam yang negatif? Tidak timeDiffseharusnya (new Date(endDate)) - (new Date(startDate));?
Feyisayo Sonubi
@ feyisayo-sonubi tergantung pada urutan yang Anda lewati, tanggal mulai dan berakhir. Dalam contoh ini(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
marcobiedermann
const timeDiff = +(new Date(start)) - +(new Date(end));
Ben Racicot
Bagus. Meskipun saya lebih sukareturn (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
dcromley
13

Menggunakan Moment.js

var future = moment('05/02/2015');
var start = moment('04/23/2015');
var d = future.diff(start, 'days'); // 9
console.log(d);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>

Michael K.
sumber
moment.js sangat berguna untuk hal-hal seperti perbedaan YTD var now = moment(), yearStart = moment().startOf('year'); var ytdDays = now.diff(yearStart, 'days'); // this can be years, months, weeks, days, hours, minutes, and seconds console.log(ytdDays); lebih penting di sini: momentjs.com
Sharif
11

Nilai tanggal di JS adalah nilai datetime.

Jadi, perhitungan tanggal langsung tidak konsisten:

(2013-11-05 00:00:00) - (2013-11-04 10:10:10) < 1 day

misalnya kita perlu mengonversi tanggal ke-2:

(2013-11-05 00:00:00) - (2013-11-04 00:00:00) = 1 day

metode ini dapat memotong pabrik di kedua tanggal:

var date1 = new Date('2013/11/04 00:00:00');
var date2 = new Date('2013/11/04 10:10:10'); //less than 1
var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);

date2 = new Date('2013/11/05 00:00:00'); //1

var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);

Norris
sumber
9

Lebih baik menyingkirkan DST, Math.ceil, Math.floor dll dengan menggunakan waktu UTC:

var firstDate = Date.UTC(2015,01,2);
var secondDate = Date.UTC(2015,04,22);
var diff = Math.abs((firstDate.valueOf() 
    - secondDate.valueOf())/(24*60*60*1000));

Contoh ini memberikan perbedaan 109 hari. 24*60*60*1000adalah satu hari dalam milidetik.

Timo Kähkönen
sumber
9

Untuk Menghitung hari antara 2 tanggal tertentu Anda dapat menggunakan kode berikut. Tanggal yang saya gunakan di sini adalah 01 Januari 2016 dan 31 Desember 2016

var day_start = new Date("Jan 01 2016");
var day_end = new Date("Dec 31 2016");
var total_days = (day_end - day_start) / (1000 * 60 * 60 * 24);
document.getElementById("demo").innerHTML = Math.round(total_days);
<h3>DAYS BETWEEN GIVEN DATES</h3>
<p id="demo"></p>

NooNa MarJa
sumber
9

Dimungkinkan untuk menghitung perbedaan hari pembuktian penuh antara dua tanggal yang bertempat di TZ yang berbeda menggunakan rumus berikut:

var start = new Date('10/3/2015');
var end = new Date('11/2/2015');
var days = (end - start) / 1000 / 60 / 60 / 24;
console.log(days);
// actually its 30 ; but due to daylight savings will show 31.0xxx
// which you need to offset as below
days = days - (end.getTimezoneOffset() - start.getTimezoneOffset()) / (60 * 24);
console.log(days);

saingan
sumber
Ini adalah jawaban yang paling benar, Anda harus mempertimbangkan DST! Terima kasih
Gisway
6

Saya menemukan pertanyaan ini ketika saya ingin melakukan perhitungan pada dua tanggal, tetapi tanggal tersebut memiliki nilai jam dan menit, saya memodifikasi jawaban @ michael-liu agar sesuai dengan kebutuhan saya, dan itu lulus ujian saya.

hari yang berbeda 2012-12-31 23:00dan 2013-01-01 01:00harus sama dengan 1. (2 jam) hari berbeda 2012-12-31 01:00dan 2013-01-01 23:00harus sama dengan 1. (46 jam)

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

var millisecondsPerDay = 24 * 60 * 60 * 1000;
function diffDays(startDate, endDate) {
    return Math.floor(treatAsUTC(endDate) / millisecondsPerDay) - Math.floor(treatAsUTC(startDate) / millisecondsPerDay);
}
guilin 桂林
sumber
6
var start= $("#firstDate").datepicker("getDate");
var end= $("#SecondDate").datepicker("getDate");
var days = (end- start) / (1000 * 60 * 60 * 24);
 alert(Math.round(days));

contoh jsfiddle :)

Aravindh Gopi
sumber
6

Saya pikir solusinya tidak benar 100% saya akan menggunakan langit-langit bukannya lantai , putaran akan bekerja tetapi itu bukan operasi yang tepat.

function dateDiff(str1, str2){
    var diff = Date.parse(str2) - Date.parse(str1); 
    return isNaN(diff) ? NaN : {
        diff: diff,
        ms: Math.ceil(diff % 1000),
        s: Math.ceil(diff / 1000 % 60),
        m: Math.ceil(diff / 60000 % 60),
        h: Math.ceil(diff / 3600000 % 24),
        d: Math.ceil(diff / 86400000)
    };
}
Tolo Palmer
sumber
4
Hari dapat memiliki lebih dari 24 jam dan menit dapat memiliki lebih dari 60 detik. Menggunakan Math.ceil () akan menghitung lebih dalam kasus ini.
Rich Dougherty
5

Bagaimana dengan menggunakan formatDate dari widget DatePicker? Anda dapat menggunakannya untuk mengonversi tanggal dalam format cap waktu (milidetik sejak 01/01/1970) lalu melakukan pengurangan sederhana.

kgiannakakis
sumber
5

function timeDifference(date1, date2) {
  var oneDay = 24 * 60 * 60; // hours*minutes*seconds
  var oneHour = 60 * 60; // minutes*seconds
  var oneMinute = 60; // 60 seconds
  var firstDate = date1.getTime(); // convert to milliseconds
  var secondDate = date2.getTime(); // convert to milliseconds
  var seconds = Math.round(Math.abs(firstDate - secondDate) / 1000); //calculate the diffrence in seconds
  // the difference object
  var difference = {
    "days": 0,
    "hours": 0,
    "minutes": 0,
    "seconds": 0,
  }
  //calculate all the days and substract it from the total
  while (seconds >= oneDay) {
    difference.days++;
    seconds -= oneDay;
  }
  //calculate all the remaining hours then substract it from the total
  while (seconds >= oneHour) {
    difference.hours++;
    seconds -= oneHour;
  }
  //calculate all the remaining minutes then substract it from the total 
  while (seconds >= oneMinute) {
    difference.minutes++;
    seconds -= oneMinute;
  }
  //the remaining seconds :
  difference.seconds = seconds;
  //return the difference object
  return difference;
}
console.log(timeDifference(new Date(2017,0,1,0,0,0),new Date()));

Noreddine Belhadj Cheikh
sumber
1
Bolehkah saya meminta Anda untuk menambahkan beberapa konteks di sekitar jawaban Anda. Jawaban khusus kode sulit dipahami. Ini akan membantu penanya dan pembaca di masa mendatang jika Anda dapat menambahkan lebih banyak informasi dalam posting Anda.
RBT
saya ingin mengedit tetapi saya mendapatkan kesalahan saya bisa mengirimkan hasil edit :(.
Noreddine Belhadj Cheikh
2
@ N.Belhadj Anda dapat mengganti semua loop sementara dengan operasi div dan mod (%) sederhana
Mihail Shishkov
4

Ini mungkin bukan solusi yang paling elegan, tetapi sepertinya menjawab pertanyaan dengan sedikit kode yang relatif sederhana, saya pikir. Tidak bisakah Anda menggunakan sesuatu seperti ini:

function dayDiff(startdate, enddate) {
  var dayCount = 0;

  while(enddate >= startdate) {
    dayCount++;
    startdate.setDate(startdate.getDate() + 1);
  }

return dayCount; 
}

Ini dengan asumsi Anda melewati objek tanggal sebagai parameter.

Popmatic
sumber
4

Jika Anda memiliki dua cap waktu unix, Anda dapat menggunakan fungsi ini (membuat sedikit lebih banyak demi kejelasan):

// Calculate number of days between two unix timestamps
// ------------------------------------------------------------
var daysBetween = function(timeStampA, timeStampB) {
    var oneDay = 24 * 60 * 60 * 1000; // hours * minutes * seconds * milliseconds
    var firstDate = new Date(timeStampA * 1000);
    var secondDate = new Date(timeStampB * 1000);
    var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    return diffDays;
};

Contoh:

daysBetween(1096580303, 1308713220); // 2455
Wallace Sidhrée
sumber
4

Hati-hati saat menggunakan milidetik .

The date.getTime () mengembalikan milidetik dan melakukan operasi matematika dengan milidetik membutuhkan untuk memasukkan

  • Daylight Saving Time (DST)
  • memeriksa apakah kedua tanggal memiliki waktu yang sama (jam, menit, detik, milidetik)
  • pastikan perilaku hari berbeda apa yang diperlukan: 19 September 2016 - 29 September 2016 = perbedaan 1 atau 2 hari?

Contoh dari komentar di atas adalah solusi terbaik yang saya temukan sejauh ini https://stackoverflow.com/a/11252167/2091095 . Tetapi gunakan +1 untuk hasilnya jika Anda ingin menghitung semua hari yang terlibat.

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

var diff = daysBetween($('#first').val(), $('#second').val()) + 1;
Dalibor Matura
sumber
4

Date.prototype.days = function(to) {
  return Math.abs(Math.floor(to.getTime() / (3600 * 24 * 1000)) - Math.floor(this.getTime() / (3600 * 24 * 1000)))
}


console.log(new Date('2014/05/20').days(new Date('2014/05/23'))); // 3 days

console.log(new Date('2014/05/23').days(new Date('2014/05/20'))); // 3 days

Abdennour TOUMI
sumber
3

Saya memiliki masalah yang sama di Angular. Saya melakukan copy karena dia akan menimpa kencan pertama. Kedua tanggal harus memiliki waktu 00:00:00 (jelas)

 /*
* Deze functie gebruiken we om het aantal dagen te bereken van een booking.
* */
$scope.berekenDagen = function ()
{
    $scope.booking.aantalDagen=0;

    /*De loper is gelijk aan de startdag van je reservatie.
     * De copy is nodig anders overschijft angular de booking.van.
     * */
    var loper = angular.copy($scope.booking.van);

    /*Zolang de reservatie beschikbaar is, doorloop de weekdagen van je start tot einddatum.*/
    while (loper < $scope.booking.tot) {
        /*Tel een dag op bij je loper.*/
        loper.setDate(loper.getDate() + 1);
        $scope.booking.aantalDagen++;
    }

    /*Start datum telt natuurlijk ook mee*/
    $scope.booking.aantalDagen++;
    $scope.infomsg +=" aantal dagen: "+$scope.booking.aantalDagen;
};
pengguna3806549
sumber
3

Saya menggunakan kode di bawah ini untuk menguji fungsi tanggal posting untuk posting berita. Saya menghitung menit atau jam atau hari atau tahun berdasarkan tanggal posting dan tanggal saat ini.

var startDate= new Date("Mon Jan 01 2007 11:00:00");
var endDate  =new Date("Tue Jan 02 2007 12:50:00");
var timeStart = startDate.getTime();
var timeEnd = endDate.getTime();
var yearStart = startDate.getFullYear();
var yearEnd   = endDate.getFullYear();
if(yearStart == yearEnd)
 {
  var hourDiff = timeEnd - timeStart; 
  var secDiff = hourDiff / 1000;
  var minDiff = hourDiff / 60 / 1000; 
  var hDiff = hourDiff / 3600 / 1000; 
  var myObj = {};
  myObj.hours = Math.floor(hDiff);
  myObj.minutes = minDiff  
  if(myObj.hours >= 24)
   {
    console.log(Math.floor(myObj.hours/24) + "day(s) ago")
   } 
 else if(myObj.hours>0)
  {
   console.log(myObj.hours +"hour(s) ago")
  }
 else
  {
   console.log(Math.abs(myObj.minutes) +"minute(s) ago")
  }
}
else
{
var yearDiff = yearEnd - yearStart;
console.log( yearDiff +" year(s) ago");
}
Ramees Rahath
sumber
Tolong jelaskan kode Anda dan Anda memecahkan masalahnya, hanya menempelkan kode dianggap jawaban yang buruk.
Marco Scabbiolo
2
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Michael Parker
Terima kasih @ MarcoScabbiolo, @ Michael Parker untuk komentarnya. Karena saya baru di Stackoverflow dalam hal menjawab, saya tidak tahu bagaimana solusinya harus dibagi
Ramees Rahath
3

jika Anda ingin memiliki DateArray dengan tanggal coba ini:

<script>
        function getDates(startDate, stopDate) {
        var dateArray = new Array();
        var currentDate = moment(startDate);
        dateArray.push( moment(currentDate).format('L'));

        var stopDate = moment(stopDate);
        while (dateArray[dateArray.length -1] != stopDate._i) {
            dateArray.push( moment(currentDate).format('L'));
            currentDate = moment(currentDate).add(1, 'days');
        }
        return dateArray;
      }
</script>

DebugSnippet

Ricardo Fercher
sumber
3

Cara sederhana untuk menghitung hari antara dua tanggal adalah dengan menghapus kedua komponen waktu mereka yaitu menetapkan jam, menit, detik dan milidetik ke 0 dan kemudian mengurangi waktu mereka dan menyelam dengan milidetik senilai satu hari.

var firstDate= new Date(firstDate.setHours(0,0,0,0));
var secondDate= new Date(secondDate.setHours(0,0,0,0));
var timeDiff = firstDate.getTime() - secondDate.getTime();
var diffDays =timeDiff / (1000 * 3600 * 24);
Sriman Pathy
sumber
masalah dengan solusi Anda adalah, Anda menganggap tanggal pertama dan tanggal kedua menjadi tanggal yang kemudian tidak perlu mengubahnya lagi, dan jika mereka bukan tanggal * yang tidak) Anda akan mendapatkan kesalahan pada setHours. untuk memperbaikinya, Anda harus memindahkan setHours darinew Date
AaA
2
function formatDate(seconds, dictionary) {
    var foo = new Date;
    var unixtime_ms = foo.getTime();
    var unixtime = parseInt(unixtime_ms / 1000);
    var diff = unixtime - seconds;
    var display_date;
    if (diff <= 0) {
        display_date = dictionary.now;
    } else if (diff < 60) {
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.second;
        } else {
            display_date = diff + ' ' + dictionary.seconds;
        }
    } else if (diff < 3540) {
        diff = Math.round(diff / 60);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.minute;
        } else {
            display_date = diff + ' ' + dictionary.minutes;
        }
    } else if (diff < 82800) {
        diff = Math.round(diff / 3600);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.hour;
        } else {
            display_date = diff + ' ' + dictionary.hours;
        }
    } else {
        diff = Math.round(diff / 86400);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.day;
        } else {
            display_date = diff + ' ' + dictionary.days;
        }
    }
    return display_date;
}
zloctb
sumber
2

Sederhana, mudah, dan canggih. Fungsi ini akan dipanggil setiap 1 detik untuk memperbarui waktu.

const year = (new Date().getFullYear());
const bdayDate = new Date("04,11,2019").getTime();  //mmddyyyy

// countdown
let timer = setInterval(function() {

// get today's date
const today = new Date().getTime();

// get the difference
const diff = bdayDate - today;

// math
let days = Math.floor(diff / (1000 * 60 * 60 * 24));
let hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
let minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
let seconds = Math.floor((diff % (1000 * 60)) / 1000);

}, 1000);
Ohhh, Itu Varun
sumber
1

Solusi yang Lebih Baik oleh

Mengabaikan bagian waktu

itu akan mengembalikan 0 jika kedua tanggal sama.

function dayDiff(firstDate, secondDate) {
  firstDate = new Date(firstDate);
  secondDate = new Date(secondDate);
  if (!isNaN(firstDate) && !isNaN(secondDate)) {
    firstDate.setHours(0, 0, 0, 0); //ignore time part
    secondDate.setHours(0, 0, 0, 0); //ignore time part
    var dayDiff = secondDate - firstDate;
    dayDiff = dayDiff / 86400000; // divide by milisec in one day
    console.log(dayDiff);
  } else {
    console.log("Enter valid date.");
  }
}

$(document).ready(function() {
  $('input[type=datetime]').datepicker({
    dateFormat: "mm/dd/yy",
    changeMonth: true,
    changeYear: true
  });
  $("#button").click(function() {
    dayDiff($('#first').val(), $('#second').val());
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<input type="datetime" id="first" value="12/28/2016" />
<input type="datetime" id="second" value="12/28/2017" />
<input type="button" id="button" value="Calculate">

Sumit Joshi
sumber
1

Sebuah kontribusi, untuk tanggal sebelum 1970-01-01 dan setelah 2038-01-19

function DateDiff(aDate1, aDate2) {
  let dDay = 0;
  this.isBissexto = (aYear) => {
    return (aYear % 4 == 0 && aYear % 100 != 0) || (aYear % 400 == 0);
  };
  this.getDayOfYear = (aDate) => {
    let count = 0;
    for (let m = 0; m < aDate.getUTCMonth(); m++) {
      count += m == 1 ? this.isBissexto(aDate.getUTCFullYear()) ? 29 : 28 : /(3|5|8|10)/.test(m) ? 30 : 31;
    }
    count += aDate.getUTCDate();
    return count;
  };
  this.toDays = () => {
    return dDay;
  };
  (() => {
    let startDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate1.toISOString()) : new Date(aDate2.toISOString());
    let endDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate2.toISOString()) : new Date(aDate1.toISOString());
    while (startDate.getUTCFullYear() != endDate.getUTCFullYear()) {
      dDay += (this.isBissexto(startDate.getFullYear())? 366 : 365) - this.getDayOfYear(startDate) + 1;
      startDate = new Date(startDate.getUTCFullYear()+1, 0, 1);
    }
    dDay += this.getDayOfYear(endDate) - this.getDayOfYear(startDate);
  })();
}
Adelson Silva Couto
sumber
0
   function validateDate() {
        // get dates from input fields
        var startDate = $("#startDate").val();
        var endDate = $("#endDate").val();
        var sdate = startDate.split("-");
        var edate = endDate.split("-");
        var diffd = (edate[2] - sdate[2]) + 1;
        var leap = [ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        var nonleap = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        if (sdate[0] > edate[0]) {
            alert("Please enter End Date Year greater than Start Date Year");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[1] > edate[1]) {
            alert("Please enter End Date month greater than Start Date month");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[2] > edate[2]) {
            alert("Please enter End Date greater than Start Date");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else {
            if (sdate[0] / 4 == 0) {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + leap[sdate[1]++];
                }
            } else {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + nonleap[sdate[1]++];
                }
            }
            document.getElementById("numberOfDays").value = diffd;
        }
    }
Parmanand Shete
sumber
0

Anda dapat menggunakan UnderscoreJS untuk memformat dan menghitung perbedaan.

Demo https://jsfiddle.net/sumitridhal/8sv94msp/

 var startDate = moment("2016-08-29T23:35:01");
var endDate = moment("2016-08-30T23:35:01");  
  

console.log(startDate);
console.log(endDate);

var resultHours = endDate.diff(startDate, 'hours', true);

document.body.innerHTML = "";
document.body.appendChild(document.createTextNode(resultHours));
body { white-space: pre; font-family: monospace; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>

Sumit Ridhal
sumber