Apa yang salah dengan kode di bawah ini?
Mungkin akan lebih mudah untuk hanya membandingkan tanggal dan bukan waktu. Saya juga tidak yakin bagaimana melakukan ini, dan saya mencari, tetapi saya tidak dapat menemukan masalah saya yang sebenarnya.
BTW, ketika saya menampilkan dua tanggal dalam suatu peringatan, mereka menunjukkan persis sama.
Kode saya:
window.addEvent('domready', function() {
var now = new Date();
var input = $('datum').getValue();
var dateArray = input.split('/');
var userMonth = parseInt(dateArray[1])-1;
var userDate = new Date();
userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
if (userDate > now)
{
alert(now + '\n' + userDate);
}
});
Apakah ada cara yang lebih sederhana untuk membandingkan tanggal dan tidak termasuk waktu?
sumber
date1 === date2
tampaknya tidak memberikan perilaku yang konsisten; lebih baik dilakukandate1.valueOf() === b.valueOf()
atau bahkandate1.getTime() === date2.getTime()
. Keanehan.var date2 = new Date(2011,8,20)
. Sekarang ubah zona waktu OS ke Waktu Pasifik (AS). Dalam jenis konsol browser yang samadate2.toDateString()
dan Anda akan kembaliMon Sep 19 2011
daripada Selasa tanggal 20!setHours()
mengatur waktu berdasarkan zona waktu saat ini, yang secara otomatis terdeteksi oleh browser. Coba:t = new Date("2016-02-29T01:45:49.098Z");
t.setHours(0,0,0,0);
console.log(t.toJSON());
akan mencetak"2016-02-28T15:00:00.000Z"
, tanggal 28, tetapi tidak 29 Zona waktu saya saat ini adalahAsia/Tokyo
setUTCxxx
metode, bukan varian lokal / sadar zona waktu.HATI-HATI WAKTU
Menggunakan objek tanggal untuk mewakili hanya-kencan langsung membuat Anda menjadi masalah presisi berlebih besar. Anda perlu mengatur waktu dan zona waktu untuk mencegahnya, dan mereka dapat menyelinap masuk kembali pada langkah apa pun. Jawaban yang diterima untuk pertanyaan ini jatuh ke dalam jebakan.
Tanggal javascript tidak memiliki gagasan tentang zona waktu . Ini adalah momen waktu (kutu sejak zamannya) dengan fungsi praktis (statis) untuk menerjemahkan ke dan dari string, menggunakan secara default zona waktu "lokal" pada perangkat, atau, jika ditentukan, UTC atau zona waktu lainnya. Untuk mewakili just-a-date ™ dengan objek tanggal, Anda ingin tanggal Anda mewakili UTC tengah malam pada awal tanggal tersebut. Ini adalah konvensi umum dan perlu yang memungkinkan Anda bekerja dengan tanggal terlepas dari musim atau zona waktu pembuatannya. Jadi, Anda harus sangat waspada untuk mengelola gagasan tentang zona waktu, baik saat Anda membuat objek Date UTC tengah malam Anda, dan ketika Anda membuat cerita bersambung.
Banyak orang bingung dengan perilaku default konsol. Jika Anda menyemprotkan tanggal ke konsol, output yang Anda lihat akan mencakup zona waktu Anda. Ini hanya karena konsol memanggil
toString()
tanggal Anda, dantoString()
memberi Anda representasi lokal. Tanggal yang mendasarinya tidak memiliki zona waktu ! (Selama waktu cocok dengan offset zona waktu, Anda masih memiliki objek tanggal UTC tengah malam)Deserializing (atau membuat objek Date UTC tengah malam)
Ini adalah langkah pembulatan, dengan trik bahwa ada dua jawaban "benar". Sebagian besar waktu, Anda ingin agar tanggal mencerminkan zona waktu pengguna. Klik jika hari ini adalah hari ulang tahun Anda . Pengguna di NZ dan AS mengklik pada waktu yang sama dan mendapatkan tanggal yang berbeda. Dalam hal ini, lakukan ini ...
Terkadang, perbandingan internasional mengalahkan akurasi lokal. Dalam hal ini, lakukan ini ...
Deserialize tanggal
Seringkali tanggal pada kawat akan berada dalam format YYYY-MM-DD. Untuk menghilangkan bakteri mereka, lakukan ini ...
Serialisasi
Setelah berhati-hati mengelola zona waktu saat Anda membuat, Anda sekarang harus memastikan untuk tidak menggunakan zona waktu saat Anda mengonversi kembali ke representasi string. Jadi Anda bisa menggunakan ...
toISOString()
getUTCxxx()
getTime() //returns a number with no time or timezone.
.toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.
Dan benar-benar menghindari yang lainnya, terutama ...
getYear()
,getMonth()
,getDate()
Jadi untuk menjawab pertanyaan Anda, 7 tahun terlambat ...
Lihat sedang berjalan ...
Perbarui 2019 ... barang gratis ...
Mengingat popularitas jawaban ini, saya telah memasukkan semuanya ke dalam kode. Fungsi berikut mengembalikan objek tanggal yang dibungkus, dan hanya memaparkan fungsi-fungsi yang aman digunakan dengan just-a-date ™.
Sebut dengan objek Tanggal dan itu akan memutuskan untuk JustADate yang mencerminkan zona waktu pengguna. Sebut dengan string: jika string adalah ISO 8601 dengan zona waktu yang ditentukan, kami hanya akan mengakhiri bagian waktu. Jika zona waktu tidak ditentukan, kami akan mengonversinya menjadi tanggal yang mencerminkan zona waktu lokal, seperti halnya untuk objek tanggal.
sumber
Bagaimana dengan ini?
Ini memungkinkan Anda untuk membandingkan bagian tanggal pada tanggal seperti ini tanpa mempengaruhi nilai variabel Anda:
sumber
Menggunakan Moment.js
Jika Anda memiliki opsi untuk menyertakan perpustakaan pihak ketiga, itu pasti layak untuk dilihat di Moment.js . Itu membuat bekerja dengan
Date
danDateTime
lebih mudah.Misalnya, melihat jika satu Tanggal datang setelah Tanggal lainnya tetapi tidak termasuk waktu mereka, Anda akan melakukan sesuatu seperti ini:
Parameter kedua Anda masuk ke
isAfter
adalah presisi untuk melakukan perbandingan dan dapat salah satu dariyear
,month
,week
,day
,hour
,minute
atausecond
.sumber
Cukup bandingkan menggunakan .toDateString seperti di bawah ini:
Ini akan mengembalikan Anda hanya bagian tanggal dan bukan waktu atau zona waktu, seperti ini:
Karenanya kedua tanggal dapat dibandingkan dalam format ini juga tanpa bagian waktu.
sumber
new Date(new Date().toDateString());
Ini mungkin versi yang sedikit lebih bersih, juga perhatikan bahwa Anda harus selalu menggunakan radix saat menggunakan parseInt.
Periksa halaman parseInt MDC untuk informasi lebih lanjut tentang radix.
JSLint adalah alat yang hebat untuk menangkap hal-hal seperti radix yang hilang dan banyak hal lain yang dapat menyebabkan kesalahan yang tidak jelas dan sulit di-debug. Ini memaksa Anda untuk menggunakan standar pengkodean yang lebih baik sehingga Anda terhindar dari sakit kepala di masa depan. Saya menggunakannya pada setiap kode proyek JavaScript saya.
sumber
The date.js perpustakaan berguna untuk hal-hal ini. Itu membuat semua skrip terkait tanggal JS jauh lebih mudah.
sumber
Jika Anda benar-benar membandingkan tanggal hanya tanpa komponen waktu, solusi lain yang mungkin terasa salah tetapi berfungsi dan menghindari semua
Date()
sakit kepala waktu dan zona waktu adalah membandingkan tanggal string ISO secara langsung menggunakan perbandingan string:Anda bisa mendapatkan tanggal saat ini (tanggal UTC, tidak perlu tanggal lokal pengguna) menggunakan:
Argumen saya yang mendukungnya adalah kesederhanaan programmer - Anda jauh lebih kecil kemungkinannya merusak ini daripada mencoba menangani data dan offset dengan benar, mungkin dengan biaya kecepatan (saya belum membandingkan kinerja)
sumber
new Date().toISOString().substr(0, 10) // "2019-04-22"
.new Date().toLocaleDateString() // "8/26/2019"
. Tapi kemudian membandingkan teks tidak akan akurat (suka"8/26/2019" >= "9/29/2001"
salah). Jadi, Anda harus mengonversinyanew Date(new Date().toLocaleDateString())
untuk secara akurat dibandingkan dengan Tanggal lainnya.Cukup gunakan toDateString () di kedua tanggal. toDateString tidak termasuk waktu, jadi untuk 2 kali pada tanggal yang sama, nilainya akan sama, seperti yang ditunjukkan di bawah ini.
Jelas beberapa kekhawatiran zona waktu yang dinyatakan di tempat lain tentang pertanyaan ini valid, tetapi dalam banyak skenario, itu tidak relevan.
sumber
Inilah cara saya melakukannya:
sumber
getTime()
diperlukan?setHours()
memodifikasi objek yang dipanggil, dan mengembalikan tanggal sebagai beberapa milidetik (setara dengan panggilangetTime()
). Oleh karena itutoday
variabel Anda bukanDate
objek seperti yang diharapkan beberapa orang, tetapi sebenarnya adalah bilangan bulat milidetik. Sebagai efek samping, inilah mengapa Anda tidak perlu menelepongetTime()
sebelum membandingkan, karena Anda sudah menggunakan cara yang tidak jelas.Karena saya tidak melihat pendekatan serupa di sini, dan saya tidak menikmati pengaturan h / m / s / ms ke 0, karena dapat menyebabkan masalah dengan transisi yang akurat ke zona waktu lokal dengan
date
objek yang diubah (saya kira begitu), biarkan saya perkenalkan di sini ini, yang ditulis beberapa saat yang lalu, fungsi lil:+
: Mudah digunakan, membuat operasi perbandingan dasar dilakukan (membandingkan hari, bulan dan tahun tanpa waktu.)-
: Tampaknya ini adalah kebalikan dari pemikiran "out of the box".Pemakaian:
datecompare(date1, '===', date2)
untuk pemeriksaan kesetaraan,datecompare(date1, '>', date2)
untuk pemeriksaan yang lebih besar,!datecompare(date1, '>', date2)
untuk pemeriksaan yang kurang atau samaJuga, jelas, Anda dapat beralih
date1
dandate2
di tempat untuk mencapai perbandingan sederhana lainnya.sumber
Cara yang efisien dan benar untuk membandingkan tanggal adalah:
Itu mengabaikan bagian waktu, itu bekerja untuk zona waktu yang berbeda, dan Anda dapat membandingkan untuk kesetaraan
==
juga. 86400000 adalah jumlah milidetik dalam sehari (= 24*60*60*1000
).Hati-hati bahwa operator kesetaraan
==
harus tidak pernah digunakan untuk membandingkan Tanggal benda karena gagal ketika Anda harapkan tes kesetaraan untuk bekerja karena membandingkan dua Tanggal benda (dan tidak membandingkan dua tanggal) misalnya:Catatan: Jika Anda membandingkan objek Date yang bagian waktunya disetel ke nol, maka Anda bisa menggunakan
date1.getTime() == date2.getTime()
tetapi itu tidak sebanding dengan optimasi. Anda dapat menggunakan<
,>
,<=
, atau>=
ketika membandingkan Tanggal objek langsung karena operator ini pertama mengkonversi objek Tanggal dengan menelepon.valueOf()
sebelum operator melakukan perbandingan.sumber
Setelah membaca pertanyaan ini waktu yang sama persis setelah diposting saya telah memutuskan untuk mengirim solusi lain, karena saya tidak menemukan yang cukup memuaskan, setidaknya untuk kebutuhan saya:
Saya telah menggunakan sesuatu seperti ini:
Dengan cara itu saya bisa menggunakan tanggal dalam format yang saya inginkan untuk diproses sesudahnya. Tapi ini hanya untuk kebutuhan saya, tetapi saya telah memutuskan untuk mengirimnya, mungkin itu akan membantu seseorang
sumber
currentDate
variabel Anda bukan tanggal, ini adalah beberapa milidetik sejak 1970-01-01. ThesetHours()
Metode memodifikasi objek tanggal itu disebut pada, dan kembali setara dengangetTime()
(nilai tanggal dalam milidetik sejak 1970/01/01).Pastikan Anda membuat
userDate
dengan tahun 4 digit sebagaisetFullYear(10, ...) !== setFullYear(2010, ...)
.sumber
Anda dapat menggunakan beberapa aritmatika dengan total ms.
Saya suka ini karena tidak ada pembaruan untuk tanggal asli dibuat dan kinerja lebih cepat daripada perpecahan string dan membandingkan.
Semoga bantuan ini!
sumber
JS ini akan mengubah konten setelah tanggal yang ditetapkan di sini adalah hal yang sama tetapi di w3schools
sumber
Ini bekerja untuk saya:
Dalam jawaban yang diterima, ada masalah zona waktu dan di waktu lain tidak 00:00:00
sumber
Saya tahu pertanyaan ini telah dijawab dan ini mungkin bukan cara terbaik, tetapi dalam skenario saya ini berfungsi dengan baik, jadi saya pikir ini dapat membantu orang seperti saya.
jika Anda memiliki
date string
sebagaidan Anda hanya ingin membandingkan bagian tanggal dengan objek Tanggal lainnya di JS,
maka Anda harus
convert
yangstring
keDate
objek dengan menggunakannew Date("2018-01-01T18:19:12.543");
dan inilah triknya: -
Saya telah menggunakan
toDateString()
dariDate object
JS, yang mengembalikan Tanggal tali saja.Catatan: Jangan lupa untuk menggunakan
.valueOf()
fungsi saat membandingkan tanggal.info lebih lanjut
.valeOf()
ada di sini referensiSelamat codding.
sumber
Ini akan membantu. Saya berhasil mendapatkannya seperti ini.
sumber
Membandingkan dengan
setHours()
akan menjadi solusi. Sampel:sumber
jika format tanggal Anda berbeda maka gunakan moment.js perpustakaan untuk mengonversi format tanggal Anda dan kemudian gunakan kode di atas untuk membandingkan dua tanggal
Contoh:
Jika Tanggal Anda di "DD / MM / YYYY" dan ingin mengubahnya menjadi "MM / DD / YYYY" maka lihat contoh kode di bawah ini
sumber
Anda dapat menggunakan fp_incr (0). Yang menetapkan bagian zona waktu ke tengah malam dan mengembalikan objek tanggal.
sumber