Pertanyaan Mendeteksi contoh tanggal "tanggal tidak valid" dalam JavaScript


Saya ingin memberi tahu perbedaan antara objek tanggal valid dan tidak valid di JS, tetapi tidak tahu 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'

Ada gagasan untuk menulis isValidDate fungsi?

  • Ash direkomendasikan Date.parse untuk parsing string tanggal, yang memberikan cara otoritatif untuk memeriksa apakah string tanggal valid.
  • Apa yang saya lebih suka, jika mungkin, adalah memiliki API saya menerima contoh Tanggal dan untuk dapat memeriksa / menegaskan apakah itu sah atau tidak. Solusi Borgar melakukan itu, tetapi saya perlu mengujinya di semua browser. Saya juga bertanya-tanya apakah ada cara yang lebih elegan.
  • Ash membuat saya mempertimbangkan untuk tidak menerima API saya Date contoh sama sekali, ini paling mudah untuk divalidasi.
  • Borgar menyarankan pengujian untuk a Date contoh, dan kemudian menguji untuk Datenilai waktu. Jika tanggal tidak valid, nilai waktu adalah NaN. Saya memeriksanya ECMA-262 dan perilaku ini dalam standar, itulah yang saya cari.

1081
2017-08-30 11:34


asal


Jawaban:


Inilah cara saya melakukannya:

if (Object.prototype.toString.call(d) === "[object Date]") {
  // it is a date
  if (isNaN(d.getTime())) {  // d.valueOf() could also work
    // date is not valid
  } else {
    // date is valid
  }
} else {
  // not a date
}

Perbarui [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:

function isValidDate(d) {
  return d instanceof Date && !isNaN(d);
}

885
2017-08-30 11:48



Alih-alih menggunakan new Date() kamu harus menggunakan:

var timestamp = Date.parse('foo');

if (isNaN(timestamp) == false) {
  var d = new Date(timestamp);
}

Date.parse() mengembalikan stempel waktu, bilangan bulat yang mewakili jumlah milidetik sejak 01 / Jan / 1970. Itu akan kembali NaN jika tidak bisa mem-parse string tanggal yang tersedia.


210
2017-08-30 11:47



Anda dapat memeriksa validitas a Date obyek d melalui

d instanceof Date && isFinite(d)

Untuk menghindari masalah lintas bingkai, seseorang dapat mengganti instanceof periksa dengan

Object.prototype.toString.call(d) === '[object Date]'

Panggilan ke getTime() seperti dalam Jawaban Borgar tidak diperlukan sebagai isNaN() dan isFinite() keduanya secara implisit dikonversi ke angka.


88
2017-08-30 14:07



Solusi saya adalah hanya memeriksa apakah Anda mendapatkan objek tanggal yang valid:

Pelaksanaan

Date.prototype.isValid = function () {
    // An invalid date object returns NaN for getTime() and NaN is the only
    // object not strictly equal to itself.
    return this.getTime() === this.getTime();
};  

Pemakaian

var d = new Date("lol");

console.log(d.isValid()); // false

d = new Date("2012/09/11");

console.log(d.isValid()); // true

66
2017-09-11 15:03



jawaban terpendek untuk memeriksa tanggal yang valid

if(!isNaN(date.getTime()))

49
2017-07-04 10:10



Anda cukup menggunakan moment.js

Berikut ini contohnya:

var m = moment('2015-11-32', 'YYYY-MM-DD');
m.isValid(); // false

Itu bagian validasi dalam dokumentasi cukup jelas.

Dan juga, bendera parsing berikut menghasilkan tanggal yang tidak valid:

  • overflow: Limpahan bidang tanggal, seperti bulan ke-13, hari ke-32 setiap bulan (atau 29 Februari pada tahun-tahun tanpa lompatan), hari ke-367 ​​tahun, dll., Luapan berisi indeks unit yang tidak valid untuk mencocokkan #invalidAt (lihat di bawah); -1 berarti tidak ada luapan.
  • invalidMonth: Nama bulan tidak valid, seperti momen ('Marbruary', 'MMMM') ;. Berisi string bulan tidak valid itu sendiri, atau yang lain null.
  • empty: String input yang berisi hal-hal yang tidak dapat diuraikan, seperti momen ('ini omong kosong') ;. Boolean.
  • Dan lain-lain

Sumber: http://momentjs.com/docs/


35
2017-10-14 20:18



Ingin menyebutkan bahwa widget JQuery UI DatePicker memiliki metode utilitas validator tanggal yang sangat baik yang memeriksa format dan validitas (misalnya, tanggal 01/33/2013 tidak diperbolehkan).

Bahkan jika Anda tidak ingin menggunakan widget datepicker di halaman Anda sebagai elemen UI, Anda selalu dapat menambahkan perpustakaan .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/

Ini tidak terdaftar sebagai metode, tetapi itu ada - sebagai fungsi utilitas. Cari halaman untuk "parsedate" dan Anda akan menemukan:

$ .datepicker.parseDate (format, nilai, pengaturan) - Mengekstrak tanggal dari nilai string dengan format yang ditentukan.

Contoh penggunaan:

var stringval = '01/03/2012';
var testdate;

try {
  testdate = $.datepicker.parseDate('mm/dd/yy', stringval);
             // Notice 'yy' indicates a 4-digit year value
} catch (e)
{
 alert(stringval + ' is not valid.  Format must be MM/DD/YYYY ' +
       'and the date value must be valid for the calendar.';
}

(Informasi lebih lanjut menentukan format tanggal ditemukan di http://api.jqueryui.com/datepicker/#utility-parseDate)

Dalam contoh di atas, Anda tidak akan melihat pesan peringatan sejak '01 / 03/2012 'adalah tanggal yang valid 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 dilewatkan berhasil diuraikan, nilai 'testdate' akan menjadi objek Tanggal Javascript yang mewakili nilai string yang diteruskan. Jika tidak, itu tidak terdefinisi.


35
2018-02-15 19:30



Saya sangat menyukai pendekatan Christoph (tetapi tidak memiliki reputasi yang cukup untuk memilihnya). Untuk penggunaan saya, saya tahu saya akan selalu memiliki objek Date, jadi saya hanya memperpanjang tanggal dengan metode valid ().

Date.prototype.valid = function() {
  return isFinite(this);
}

Sekarang saya bisa menulis ini dan itu jauh lebih deskriptif daripada hanya memeriksa isFinite dalam kode ...

d = new Date(userDate);
if (d.valid()) { /* do stuff */ }

22
2017-11-23 19:47



Saya menggunakan kode berikut untuk memvalidasi nilai untuk tahun, bulan, dan tanggal.

function createDate(year, month, _date) {
  var d = new Date(year, month, _date);
  if (d.getFullYear() != year 
    || d.getMonth() != month
    || d.getDate() != _date) {
    throw "invalid date";
  }
  return d;
}

Untuk detail, lihat Periksa tanggal dalam javascript


15
2017-10-27 09:55



// check whether date is valid
var t = new Date('2011-07-07T11:20:00.000+00:00x');
valid = !isNaN(t.valueOf());

14
2017-07-06 21:27



Terlalu banyak jawaban rumit di sini, tetapi garis sederhana sudah cukup (ES5):

Date.prototype.isValid = function (d) { return !isNaN(Date.parse(d)) } ;

atau bahkan di ES6:

Date.prototype.isValid = d => !isNaN(Date.parse(d));

11
2018-05-11 09:17