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>
javascript
date
Michael Haren
sumber
sumber
Jawaban:
Berikut ini adalah implementasi cepat dan kotor
datediff
, 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).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.
Date
- Referensi JavaScript MDNJuga, untuk tujuan ilustrasi, potongan menggunakan akses bernama pada
window
objek untuk singkatnya, tetapi dalam produksi Anda harus menggunakan API standar seperti getElementById , atau lebih mungkin, beberapa kerangka UI.sumber
parseDate
metode menjadi:return new Date(mdy[2], mdy[1], mdy[0]-1);
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:
Meskipun
Math.round
mengembalikan 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: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
daysBetween
Metode yang ditunjukkan di atas mengambil keuntungan dari fakta ini dengan panggilan pertamatreatAsUTC
untuk menyesuaikan kedua kali lokal untuk tengah malam UTC, sebelum mengurangi dan membagi.1. JavaScript mengabaikan lompatan detik.
sumber
Date.UTC(...)
di tempat pertama.Cara termudah untuk mendapatkan perbedaan antara dua tanggal:
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:
Ini adalah versi James versi refactored saya:
sumber
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:
sumber
end.diff(start,"days")
walaupun kode yang ditulis akan bekerja karena tanggal mulai setelah tanggal akhir!Saya akan pergi ke depan dan mengambil utilitas kecil ini dan di dalamnya Anda akan menemukan fungsi untuk ini untuk Anda. Ini contoh singkatnya:
sumber
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.
sumber
timeDiff
kembali dalam yang negatif? TidaktimeDiff
seharusnya(new Date(endDate)) - (new Date(startDate));
?(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
const timeDiff = +(new Date(start)) - +(new Date(end));
return (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
Menggunakan Moment.js
sumber
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.comNilai tanggal di JS adalah nilai datetime.
Jadi, perhitungan tanggal langsung tidak konsisten:
misalnya kita perlu mengonversi tanggal ke-2:
metode ini dapat memotong pabrik di kedua tanggal:
sumber
Lebih baik menyingkirkan DST, Math.ceil, Math.floor dll dengan menggunakan waktu UTC:
Contoh ini memberikan perbedaan 109 hari.
24*60*60*1000
adalah satu hari dalam milidetik.sumber
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
sumber
Dimungkinkan untuk menghitung perbedaan hari pembuktian penuh antara dua tanggal yang bertempat di TZ yang berbeda menggunakan rumus berikut:
sumber
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:00
dan2013-01-01 01:00
harus sama dengan 1. (2 jam) hari berbeda2012-12-31 01:00
dan2013-01-01 23:00
harus sama dengan 1. (46 jam)sumber
contoh jsfiddle :)
sumber
Saya pikir solusinya tidak benar 100% saya akan menggunakan langit-langit bukannya lantai , putaran akan bekerja tetapi itu bukan operasi yang tepat.
sumber
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.
sumber
sumber
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:
Ini dengan asumsi Anda melewati objek tanggal sebagai parameter.
sumber
Jika Anda memiliki dua cap waktu unix, Anda dapat menggunakan fungsi ini (membuat sedikit lebih banyak demi kejelasan):
Contoh:
sumber
Hati-hati saat menggunakan milidetik .
The date.getTime () mengembalikan milidetik dan melakukan operasi matematika dengan milidetik membutuhkan untuk memasukkan
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.
sumber
sumber
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)
sumber
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.
sumber
jika Anda ingin memiliki DateArray dengan tanggal coba ini:
DebugSnippet
sumber
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.
sumber
new Date
sumber
Sederhana, mudah, dan canggih. Fungsi ini akan dipanggil setiap 1 detik untuk memperbarui waktu.
sumber
Solusi yang Lebih Baik oleh
itu akan mengembalikan 0 jika kedua tanggal sama.
sumber
Sebuah kontribusi, untuk tanggal sebelum 1970-01-01 dan setelah 2038-01-19
sumber
sumber
Anda dapat menggunakan UnderscoreJS untuk memformat dan menghitung perbedaan.
Demo https://jsfiddle.net/sumitridhal/8sv94msp/
sumber