Saya ingin memberi tahu perbedaan antara objek tanggal yang valid dan tidak valid di JS, tetapi tidak dapat mengetahui caranya:
var d = new Date("foo");
console.log(d.toString()); // shows 'Invalid Date'
console.log(typeof d); // shows 'object'
console.log(d instanceof Date); // shows 'true'
Adakah ide untuk menulis suatu isValidDate
fungsi?
- Ash direkomendasikan
Date.parse
untuk penguraian string tanggal, yang memberikan cara otoritatif untuk memeriksa apakah string tanggal valid. - Apa yang saya inginkan, jika mungkin, adalah agar API saya menerima contoh Tanggal dan untuk dapat memeriksa / menegaskan apakah itu valid atau tidak. Solusi Borgar melakukan itu, tetapi saya perlu mengujinya di seluruh browser. Saya juga bertanya-tanya apakah ada cara yang lebih elegan.
- Ash membuat saya menganggap API saya tidak dapat menerima
Date
instance sama sekali, ini akan lebih mudah untuk divalidasi. - Borgar menyarankan pengujian untuk
Date
contoh, dan kemudian pengujian untuk nilaiDate
waktu itu. Jika tanggal tidak valid, nilai waktu adalahNaN
. Saya memeriksa dengan ECMA-262 dan perilaku ini dalam standar, yang persis apa yang saya cari.
javascript
date
orip
sumber
sumber
return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
Jawaban:
Begini cara saya melakukannya:
Pembaruan [2018-05-31] : Jika Anda tidak peduli dengan objek Tanggal dari konteks JS lainnya (jendela eksternal, bingkai, atau iframe), bentuk yang lebih sederhana ini mungkin lebih disukai:
sumber
d.getTime
hanyaisNan(d)
d instanceof Date && !isNaN(d.getTime())
1
misalnya saya masih akan memiliki tanggal yang valid yang menghasilkanMon Jan 01 2001 00:00:00
tanggal, namun untuk keperluan aplikasi saya itu sama sekali tidak berguna . Jadi, setidaknya ada beberapa validasi input yang diperlukan dalam kasus saya. Jawaban ini memvalidasidateObject
bukanDate
!Alih-alih menggunakan
new Date()
Anda harus menggunakan:Date.parse()
mengembalikan timestamp, bilangan bulat yang mewakili jumlah milidetik sejak 01 / Jan / 1970. Ini akan kembaliNaN
jika tidak dapat menguraikan string tanggal yang disediakan.sumber
Date.parse
tergantung pada implementasi dan jelas tidak dapat dipercaya untuk mengurai string tanggal umum. Tidak ada format tunggal yang diuraikan dengan benar di browser populer, apalagi semua yang digunakan (meskipun akhirnya format ISO8601 yang ditentukan dalam ES5 harus ok).new Date('foo')
itu pada dasarnya setara denganDate.parse('foo')
metode. Lihat: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Jadi apa yang dikatakan @RobG, itu juga berlaku untuk itu.Anda dapat memeriksa validitas
Date
objekd
melaluiUntuk menghindari masalah lintas-bingkai, seseorang dapat mengganti
instanceof
cek denganPanggilan untuk
getTime()
seperti dalam jawaban Borgar tidak perlu karenaisNaN()
danisFinite()
keduanya secara implisit dikonversi ke nomor.sumber
isFinite()
-toString.call()
hanya penggantiinstanceof
bagian dari cekisFinite
lebihisNaN
(baik bekerja dengan baik denganDate(Infinity)
). Selain itu, jika Anda ingin kondisi sebaliknya, itu akan sedikit lebih sederhana:if (!(date instanceof Date) || isNaN(date))
.Solusi saya adalah hanya memeriksa apakah Anda mendapatkan objek tanggal yang valid:
Penerapan
Pemakaian
sumber
isNaN
adalah cara yang lebih eksplisit untuk menguji NaNisNaN("a") === true
, sementara("a" !== "a") === false
. Ini layak untuk dipikirkan. +1new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time)
. Jika Anda meneruskan string ke konstruktor tanggal, Anda harus meneruskan string standar untuk mendapatkan hasil yang andal. Secara khusus, "String harus dalam format yang dikenali oleh metode Date.parse ()". developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…jawaban terpendek untuk memeriksa tanggal yang valid
sumber
date && !isNaN(date.getTime())
date
bukan tipe Date. Sebagai contoh:var date = 4; date && !isNaN(date.getTime());
.date instanceof Date && !isNaN(date.getTime())
Anda cukup menggunakan moment.js
Berikut ini sebuah contoh:
Bagian validasi dalam dokumentasi cukup jelas.
Dan juga, parsing flag berikut menghasilkan tanggal yang tidak valid:
overflow
: Limpahan bidang tanggal, seperti bulan ke-13, hari ke-32 dalam sebulan (atau tanggal 29 Februari pada tahun-tahun non-kabisat), hari ke-367 dalam setahun, dll. Luapan berisi indeks unit yang tidak valid untuk mencocokkan #invalidAt (lihat di bawah); -1 berarti tidak ada luapan.invalidMonth
: Nama bulan yang tidak valid, seperti saat ('Marbruary', 'MMMM') ;. Berisi string bulan yang tidak valid itu sendiri, atau null.empty
: String input yang tidak mengandung apa-apa yang dapat diuraikan, seperti momen ('this is nonsense') ;. Boolean.Sumber: http://momentjs.com/docs/
sumber
moment("11/06/1986", "DD/MM/YYYY").isValid();
Ingin menyebutkan bahwa widget DatePicker jQuery UI memiliki metode utilitas validator tanggal yang sangat baik yang memeriksa format dan validitas (misalnya, tidak ada tanggal 01/33/2013 yang dibolehkan).
Bahkan jika Anda tidak ingin menggunakan widget datepicker pada halaman Anda sebagai elemen UI, Anda selalu dapat menambahkan pustaka .js ke halaman Anda dan kemudian memanggil metode validator, meneruskan nilai yang ingin Anda validasikan ke dalamnya. Untuk membuat hidup lebih mudah, dibutuhkan string sebagai input, bukan objek Tanggal JavaScript.
Lihat: http://api.jqueryui.com/datepicker/
Itu tidak terdaftar sebagai metode, tetapi itu ada - sebagai fungsi utilitas. Cari halaman untuk "parsedate" dan Anda akan menemukan:
$ .datepicker.parseDate (format, nilai, pengaturan) - Ekstrak tanggal dari nilai string dengan format yang ditentukan.
Contoh penggunaan:
(Info lebih lanjut menentukan format tanggal dapat ditemukan di http://api.jqueryui.com/datepicker/#utility-parseDate )
Dalam contoh di atas, Anda tidak akan melihat pesan peringatan karena '01 / 03/2012 'adalah tanggal yang valid dengan kalender dalam format yang ditentukan. Namun jika Anda membuat 'stringval' sama dengan '13 / 04/2013 ', misalnya, Anda akan mendapatkan pesan peringatan, karena nilai '13 / 04/2013' tidak valid kalender.
Jika nilai string yang lewat berhasil diurai, nilai 'testdate' akan menjadi objek Tanggal Javascript yang mewakili nilai string yang diteruskan. Jika tidak, itu tidak akan ditentukan.
sumber
Saya sangat menyukai pendekatan Christoph (tetapi tidak memiliki cukup reputasi untuk memilihnya). Untuk penggunaan saya, saya tahu saya akan selalu memiliki objek Tanggal jadi saya hanya memperpanjang tanggal dengan metode yang valid ().
Sekarang saya bisa menulis ini dan itu jauh lebih deskriptif daripada hanya memeriksa isFinite dalam kode ...
sumber
isFinite
berhasil untuk saya dengan sempurna. Tapi ya, tidak ada gunanya memperpanjang prototipe.!isFinite
padaDate
wasiat menangkap fakta bahwaDate
ituInvalid Date
. Juga perlu dicatat konteks saya ada di dalam Node.sumber
Anda dapat memeriksa format txDate.value dengan skirpt ini. jika itu dalam format yang salah Date obejct tidak dipasang dan mengembalikan null ke dt.
Dan seperti yang disarankan @ MiF secara singkat
sumber
Saya menggunakan kode berikut untuk memvalidasi nilai untuk tahun, bulan dan tanggal.
Untuk detailnya, lihat Periksa tanggal dalam javascript
sumber
str
tidak digunakan.Sudah terlalu banyak jawaban rumit di sini, tetapi garis sederhana sudah cukup (ES5):
atau bahkan di ES6:
sumber
Date.parse(true)
, saya mendapatkan NaN dengan benar.Saya melihat beberapa jawaban yang mendekati potongan kecil ini.
Cara JavaScript:
Cara TypeScript:
sumber
Solusi bagus! Termasuk di perpustakaan fungsi bantu saya, sekarang tampilannya seperti ini:
sumber
Ini hanya bekerja untuk saya
Namun ini tidak berhasil
sumber
`${new Date('foo')}` === 'Invalid Date'
Untuk proyek Angular.js Anda dapat menggunakan:
sumber
Tidak satu pun dari jawaban ini yang berfungsi untuk saya (diuji di Safari 6.0) ketika mencoba memvalidasi tanggal seperti 2/31/2012, namun, mereka berfungsi dengan baik ketika mencoba tanggal yang lebih dari 31.
Jadi saya harus sedikit memaksa. Dengan asumsi tanggal dalam format
mm/dd/yyyy
. Saya menggunakan jawaban @broox:sumber
&& value.split('/')[0] == (d.getMonth()+1);
new Date('string date')
setara denganDate.parse('string date')
, lihat: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… sehingga Anda mungkin mendapatkan nilai false true atau false.Tidak satu pun dari solusi di atas yang berhasil bagi saya apa yang berhasil adalah
kode di atas akan melihat ketika JS membuat 02/31/2012 menjadi 03/02/2012 yang tidak valid
sumber
sumber
Saya sudah menulis fungsi ini. Berikan parameter string dan itu akan menentukan apakah itu tanggal yang valid atau tidak berdasarkan format ini "dd / MM / yyyy".
ini dia ujian
input: "hahaha", output: false.
input: "29/2/2000", output: true.
input: "29/2/2001", output: false.
sumber
Date.prototype.toISOString
melemparRangeError
(setidaknya di Chromium dan Firefox) pada tanggal yang tidak valid. Anda dapat menggunakannya sebagai sarana validasi dan mungkin tidak perluisValidDate
seperti itu (EAFP). Kalau tidak, itu:sumber
Terinspirasi oleh pendekatan Borgar, saya telah memastikan bahwa kode tidak hanya memvalidasi tanggal, tetapi benar-benar memastikan tanggal tersebut adalah tanggal nyata, yang berarti bahwa tanggal seperti 31/09/2011 dan 29/02/2011 tidak diperbolehkan.
sumber
dd/MM/yyyy
notasi. Juga, itu kembalitrue
ketika itu valid &'Invalid date!'
jika tidak, lebih baik kembalikan hanya 1 jenis.Saya menggabungkan hasil kinerja terbaik yang saya temukan di sekitar itu memeriksa apakah objek yang diberikan:
Hasilnya adalah sebagai berikut:
sumber
Objek tanggal ke string adalah cara yang lebih sederhana dan andal untuk mendeteksi jika kedua bidang adalah tanggal yang valid. mis. Jika Anda memasukkan "-------" ke kolom input tanggal. Beberapa jawaban di atas tidak akan berfungsi.
sumber
Jawaban yang dipilih sangat bagus, dan saya juga menggunakannya. Namun, jika Anda mencari cara untuk memvalidasi input tanggal pengguna, Anda harus menyadari bahwa objek Date sangat gigih membuat argumen konstruksi yang tidak valid menjadi yang valid. Kode tes unit berikut menggambarkan poin:
sumber
Sebut saja seperti ini
sumber
Fungsi siap berdasarkan jawaban berperingkat teratas:
sumber
Solusi sederhana dan elegan:
sumber:
[1] https://medium.com/@esganzerla/simple-date-validation-with-javascript-caea0f71883c
[2] Tanggal salah ditampilkan dalam Tanggal baru () dalam JavaScript
sumber
date.getDate() == day
tidak cukup untuk menentukan apakah tanggal tersebut valid. Format tanggal asli akan mengembalikan tanggal yang tidak valid dalam beberapa implementasi terlepas dari apakah tanggal tersebut valid atau tidak. Juga "1970-01-01 00:00" jika diurai dengan benar akanBoolean(+new Date("1970-01-01"))
menghasilkan false (mis. Return false).const date = new Date(year, month, day);
Perhatikan bahwa bulan 0 diindeks dengan cara ini sehingga Anda mungkin harus mengurangi satu untuk berbaris dengan benar.Saya pikir beberapa dari ini adalah proses yang panjang. Kita dapat memotongnya seperti yang ditunjukkan di bawah ini:
sumber
Untuk komponen berdasarkan tanggal 1 int:
Tes:
sumber