Apa cara yang mudah untuk memeriksa apakah suatu nilai adalah tanggal yang valid, format tanggal yang diketahui diperbolehkan.
Misalnya saya memiliki nilai-nilai 10-11-2009
, 10/11/2009
, 2009-11-10T07:00:00+0000
yang semua harus diakui sebagai nilai tanggal, dan nilai-nilai 200
, 10
, 350
, yang seharusnya tidak diakui sebagai nilai tanggal. Apa cara termudah untuk memeriksa ini, jika ini mungkin? Karena stempel waktu juga akan diizinkan.
javascript
date-format
Thizzer
sumber
sumber
Jawaban:
Apakah
Date.parse()
cukup?Lihat halaman Dokumentasi MDN relatifnya .
sumber
Date.parse("4.3")
adalah986270400000
.Pembaruan 2015
Ini adalah pertanyaan lama tetapi pertanyaan baru lainnya seperti:
ditutup sebagai duplikat dari yang satu ini, jadi menurut saya penting untuk menambahkan beberapa info baru di sini. Saya menulisnya karena saya takut berpikir bahwa orang benar-benar menyalin dan menempelkan beberapa kode yang diposting di sini dan menggunakannya dalam produksi.
Sebagian besar jawaban di sini baik menggunakan beberapa kalimat biasa kompleks yang cocok format hanya beberapa yang sangat spesifik dan benar-benar melakukannya dengan benar (seperti pencocokan 32 Januari sementara tidak cocok tanggal ISO yang sebenarnya seperti yang diiklankan - lihat demo ) atau mereka mencoba untuk lulus apa-apa untuk
Date
konstruktor dan berharap yang terbaik.Menggunakan Momen
Seperti yang saya jelaskan dalam jawaban ini, saat ini ada perpustakaan yang tersedia untuk itu: Moment.js
Ini adalah pustaka untuk mengurai, memvalidasi, memanipulasi, dan menampilkan tanggal dalam JavaScript, yang memiliki API yang jauh lebih kaya daripada fungsi penanganan tanggal JavaScript standar.
Ini adalah 12kB diperkecil / di-gzip dan berfungsi di Node.js dan tempat lain:
Dengan menggunakan Momen, Anda bisa sangat spesifik tentang memeriksa tanggal yang valid. Terkadang sangat penting untuk menambahkan beberapa petunjuk tentang format yang Anda harapkan. Misalnya, tanggal seperti 06/22/2015 tampak seperti tanggal yang valid, kecuali jika Anda menggunakan format DD / MM / YYYY dalam hal ini tanggal ini harus ditolak karena tidak valid. Ada beberapa cara untuk memberi tahu Momen format apa yang Anda harapkan, misalnya:
moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false
The
true
Argumen ada begitu Moment tidak akan mencoba untuk mengurai input jika tidak persis sesuai dengan salah satu format yang disediakan (itu harus menjadi perilaku default menurut saya).Anda dapat menggunakan format yang disediakan secara internal:
moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true
Dan Anda dapat menggunakan berbagai format sebagai array:
var formats = [ moment.ISO_8601, "MM/DD/YYYY :) HH*mm*ss" ]; moment("2015-06-22T13:17:21+0000", formats, true).isValid(); // true moment("06/22/2015 :) 13*17*21", formats, true).isValid(); // true moment("06/22/2015 :( 13*17*21", formats, true).isValid(); // false
Lihat: DEMO .
Perpustakaan lainnya
Jika Anda tidak ingin menggunakan Moment.js, ada juga perpustakaan lain:
Pembaruan 2016
Saya membuat modul imoment yang seperti (bagian dari) Momen tetapi tanpa kejutan yang disebabkan oleh mutasi objek yang ada (lihat dokumen untuk info lebih lanjut).
Pembaruan 2018
Hari ini saya merekomendasikan menggunakan Luxon untuk manipulasi tanggal / waktu daripada Momen, yang (tidak seperti Momen) membuat semua objek tidak dapat diubah sehingga tidak ada kejutan buruk terkait dengan mutasi implisit pada tanggal.
Info lebih lanjut
Lihat juga:
Serangkaian artikel oleh Rob Gravelle tentang pustaka pengurai tanggal JavaScript:
Intinya
Tentu saja siapa pun dapat mencoba menemukan kembali roda, menulis ekspresi reguler (tetapi harap benar-benar membaca ISO 8601 dan RFC 3339 sebelum Anda melakukannya) atau memanggil konstruktor buit-in dengan data acak untuk mengurai pesan kesalahan seperti
'Invalid Date'
(Anda yakin pesan ini adalah persis sama di semua platform? Di semua lokal? Di masa mendatang?) atau Anda dapat menggunakan solusi yang telah diuji dan menggunakan waktu Anda untuk memperbaikinya, bukan menciptakannya kembali. Semua perpustakaan yang tercantum di sini adalah sumber terbuka, perangkat lunak gratis.sumber
moment("whatever 123").isValid()
kembalitrue
.moment("06/22/2015", "DD/MM/YYYY", true).isValid();
dengan format tanggal yang diharapkan disediakan secara eksplisit dan dengan argumen yangtrue
berarti pemeriksaan ketat. Saya memperbarui jawaban saya dengan lebih banyak info dan contoh yang lebih baik.Beginilah cara saya memecahkan masalah ini di aplikasi yang saya kerjakan sekarang:
diperbarui berdasarkan umpan balik dari krillgar:
var isDate = function(date) { return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date)); }
sumber
new Date(date)
tidak memberi Anda 'Tanggal Tidak Valid'.new Date(date) !== "Invalid Date"
akan selalu mengembalikan nilai true karena ekspresi kiri akan mengembalikan objek Tanggal dengan nilai waktu NaN , yang tidak akan pernah menjadi===
string. Menggunakan==
"berhasil" karena jenis konversi. Tetapi karena penguraian string tanggal sebagian besar masih bergantung pada implementasi, mengandalkannya untuk mengurai format acak, kami sangat cacat.isDate('Mac OS X 10.14.2')
kembali benar di sini.new Date(date) === 'Invalid Date'
hanya berfungsi di Firefox dan Chrome. IE8 (yang saya miliki di mesin saya untuk tujuan pengujian) memberikan NaN.Seperti yang dinyatakan pada jawaban yang diterima,
Date.parse(date)
juga akan berfungsi untuk angka. Jadi untuk menyiasatinya, Anda juga dapat memeriksa bahwa itu bukan angka (jika itu adalah sesuatu yang ingin Anda konfirmasi).var parsedDate = Date.parse(date); // You want to check again for !isNaN(parsedDate) here because Dates can be converted // to numbers, but a failed Date parse will not. if (isNaN(date) && !isNaN(parsedDate)) { /* do your work */ }
sumber
isNan
itu bukan fungsi; kasus yang salah pada contoh pertama.date
adalahFoostreet 1
, kondisi Anda dievaluasi sebagai benar.parse
solusi berbasis lain :Date.parse("<text here> <number here>")
kemungkinan akan diuraikan menjadi tanggal yang "valid", menyebabkanparsedDate
untuk tidak mengevaluasiNaN
.Bagaimana dengan sesuatu yang seperti ini? Ini akan menguji apakah itu objek Tanggal atau string tanggal:
function isDate(value) { var dateFormat; if (toString.call(value) === '[object Date]') { return true; } if (typeof value.replace === 'function') { value.replace(/^\s+|\s+$/gm, ''); } dateFormat = /(^\d{1,4}[\.|\\/|-]\d{1,2}[\.|\\/|-]\d{1,4})(\s*(?:0?[1-9]:[0-5]|1(?=[012])\d:[0-5])\d\s*[ap]m)?$/; return dateFormat.test(value); }
Saya harus menyebutkan bahwa ini tidak menguji string berformat ISO tetapi dengan sedikit lebih banyak pekerjaan ke RegExp Anda harus baik.
sumber
Tidak ada jawaban di sini yang memeriksa apakah tanggal tersebut tidak valid seperti 31 Februari. Fungsi ini membahas bahwa dengan memeriksa apakah bulan yang dikembalikan sama dengan bulan asli dan memastikan tahun yang valid telah disajikan.
//expected input dd/mm/yyyy or dd.mm.yyyy or dd-mm-yyyy function isValidDate(s) { var separators = ['\\.', '\\-', '\\/']; var bits = s.split(new RegExp(separators.join('|'), 'g')); var d = new Date(bits[2], bits[1] - 1, bits[0]); return d.getFullYear() == bits[2] && d.getMonth() + 1 == bits[1]; }
sumber
Gunakan ekspresi reguler untuk memvalidasinya.
isDate('2018-08-01T18:30:00.000Z'); isDate(_date){ const _regExp = new RegExp('^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$'); return _regExp.test(_date); }
sumber
Dengan mengacu pada semua komentar di atas, saya telah menemukan solusinya.
Ini berfungsi jika yang
Date
diteruskan dalam format ISO atau perlu dimanipulasi untuk format lain.var isISO = "2018-08-01T18:30:00.000Z"; if (new Date(isISO) !== "Invalid Date" && !isNaN(new Date(isISO))) { if(isISO == new Date(isISO).toISOString()) { console.log("Valid date"); } else { console.log("Invalid date"); } } else { console.log("Invalid date"); }
Anda bisa bermain di sini di JSFiddle.
sumber
YYYY-MM-DD
, jadi sepele untuk melampirkanT00:00:00.000Z
dan menggunakan solusi ini untuk memeriksa string yang valid.function isDate(dateStr) { return !isNaN(new Date(dateStr).getDate()); }
sumber
Date.parse
, sayangnya, tidak benar karena baik yang disebutkan sebelumnya danDate()
konstruktor dipanggil dengan fungsi string yang hampir sama.Berikut adalah peningkatan fungsi yang hanya menggunakan
Date.parse()
:function isDate(s) { if(isNaN(s) && !isNaN(Date.parse(s))) return true; else return false; }
Catatan: Date.parse () akan mengurai angka: misalnya
Date.parse(1)
akan mengembalikan tanggal. Jadi di sini kita periksa apakahs
bukan angka, jika itu tanggal.sumber
Saya akan melakukan ini
var myDateStr= new Date("2015/5/2"); if( ! isNaN ( myDateStr.getMonth() )) { console.log("Valid date"); } else { console.log("Invalid date"); }
Mainkan disini
sumber
EXAMPLE STRING 12345
dan mengembalikan "Tanggal valid".Ini versi minimalisnya.
var isDate = function (date) { return!!(function(d){return(d!=='Invalid Date'&&!isNaN(d))})(new Date(date)); }
sumber
isDate(" 1")
Fungsi yang dapat dipanggil ini bekerja dengan sempurna, mengembalikan nilai true untuk tanggal yang valid. Pastikan untuk menelepon menggunakan tanggal dengan format ISO (tttt-bb-hh atau tttt / bb / hh):
function validateDate(isoDate) { if (isNaN(Date.parse(isoDate))) { return false; } else { if (isoDate != (new Date(isoDate)).toISOString().substr(0,10)) { return false; } } return true; }
sumber
return !isNaN(Date.parse(isoDate)) || isoDate == new Date(isoDate).toISOString().substr(0,10);
Saya tahu ini adalah pertanyaan lama tetapi saya menghadapi masalah yang sama dan melihat bahwa tidak ada jawaban yang berfungsi dengan baik - secara khusus menyingkirkan nomor (1.200.345, dll ..) dari tanggal, yang merupakan pertanyaan asli. Berikut adalah metode yang agak tidak ortodoks yang dapat saya pikirkan dan tampaknya berhasil. Harap tunjukkan jika ada kasus di mana itu akan gagal.
if(sDate.toString() == parseInt(sDate).toString()) return false;
Ini adalah garis untuk menyingkirkan angka. Dengan demikian, seluruh fungsi akan terlihat seperti:
function isDate(sDate) { if(sDate.toString() == parseInt(sDate).toString()) return false; var tryDate = new Date(sDate); return (tryDate && tryDate.toString() != "NaN" && tryDate != "Invalid Date"); } console.log("100", isDate(100)); console.log("234", isDate("234")); console.log("hello", isDate("hello")); console.log("25 Feb 2018", isDate("25 Feb 2018")); console.log("2009-11-10T07:00:00+0000", isDate("2009-11-10T07:00:00+0000"));
sumber
console.log("hello 1 ", isDate("hello 1 "));
kembali benarapakah baik-baik saja untuk memeriksa fungsi terkait Tanggal tersedia untuk objek untuk menemukan apakah itu objek Tanggal atau bukan?
Suka
var l = new Date(); var isDate = (l.getDate !== undefined) ? true; false;
sumber
Beginilah akhirnya saya melakukannya. Ini tidak mencakup semua format. Anda harus menyesuaikannya. Saya memiliki kendali atas formatnya, jadi ini berfungsi untuk saya
function isValidDate(s) { var dt = ""; var bits = []; if (s && s.length >= 6) { if (s.indexOf("/") > -1) { bits = s.split("/"); } else if (s.indexOf("-") > -1) { bits = s.split("-"); } else if (s.indexOf(".") > -1) { bits = s.split("."); } try { dt = new Date(bits[2], bits[0] - 1, bits[1]); } catch (e) { return false; } return (dt.getMonth() + 1) === parseInt(bits[0]); } else { return false; } }
sumber
Oke, ini pertanyaan lama, tetapi saya menemukan solusi lain saat memeriksa solusi di sini. Bagi saya bekerja untuk memeriksa apakah fungsi getTime () ada di objek tanggal:
const checkDate = new Date(dateString); if (typeof checkDate.getTime !== 'function') { return; }
sumber
document.getElementById('r1').innerHTML = dayjs('sdsdsd').isValid() document.getElementById('r2').innerHTML = dayjs('2/6/20').isValid()
<script src="https://unpkg.com/[email protected]/dayjs.min.js"></script> <p>'sdsdsd' is a date: <span id="r1"></span></p> <p>'2/6/20' is a date: <span id="r2"></span></p>
Sebuah ringan perpustakaan siap Anda: Day.js
sumber
SimpleDateFormat sdf = new SimpleDateFormat(dateFromat); sdf.setLenient(false);
Secara default, ini disetel ke TRUE. Jadi, bahkan string dengan format yang salah mengembalikan nilai yang baik.
Saya telah menggunakannya seperti ini:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd"); formatter.setLenient(false); String value = "1990/13/23"; try { Date date = formatter.parse(value); System.out.println(date); }catch (ParseException e) { System.out.println("its bad"); }
sumber
Coba ini:
if (var date = new Date(yourDateString)) { // if you get here then you have a valid date }
sumber