Periksa apakah tanggal itu valid


124

Berikut skenarionya:

Saya memiliki Stringtanggal dan format tanggal yang berbeda. Mis .:
tanggal: tanggal: 10-19
2016Format: "DD-MM-YYYY".

Saya perlu memeriksa apakah tanggal ini adalah tanggal yang valid.

Saya telah mencoba mengikuti hal-hal

var d = moment("2016-10-19",dateFormat);

d.isValid()selalu kembali false. Apakah Moment.js tidak mengurai tanggal dalam format yang diberikan?

Kemudian saya mencoba memformat tanggal DD-MM-YYYYterlebih dahulu dan kemudian meneruskannya ke Moment.js:

var d = moment("2016-10-19").format(dateFormat);
var date = moment(d, dateFormat);

Sekarang date.isValid()memberi saya hasil yang diinginkan, tetapi di sini objek tanggal Moment.js dibuat dua kali. Bagaimana saya bisa menghindari ini? Apakah ada solusi yang lebih baik?

FYI saya tidak diizinkan untuk mengubah dateFormat.


Apakah Anda tidak diizinkan untuk mengubah nilai dateFormat? Dalam hal ini, Anda harus mengubah format input, karena 2016-10-19 adalah YYYY-MM-DD, bukan DD-MM-YYYY. Apa yang boleh Anda ubah?
Pochen

Masukan berasal dari pemilih tanggal. Tidak bisa mengubahnya juga :(
Ganesh

1
Bolehkah saya bertanya mengapa Anda tidak diizinkan untuk mengubah variabel dateFormat? var d = momen ("19-10-2016", "DD-MM-YYYY"); akan menyelesaikan masalah Anda sejauh yang saya ketahui
Pochen

benar-benar tidak bisa mengatakannya. Tapi itu bukan kendali saya untuk mengubah nilai itu.
Ganesh

Jawaban:


185

Mampu menemukan solusinya. Karena tanggal yang saya peroleh dalam format ISO, hanya memberikan tanggal ke saat akan memvalidasinya, tidak perlu meneruskan dateFormat.

var date = moment("2016-10-19");

Dan kemudian date.isValid()memberikan hasil yang diinginkan.


15
Adakah yang tahu apa metode yang disukai saat ini? Metode ini sekarang menampilkan "Peringatan Penghentian" berikut: konstruksi momen kembali ke js Date. Ini tidak disarankan dan akan dihapus dalam rilis besar mendatang. Silakan merujuk ke github.com/moment/moment/issues/1407 untuk info lebih lanjut.
Andrew


4
Perlu diketahui bahwa ini tidak selalu berfungsi: var a = moment('12345'); a.isValid() // is trueIni gagal karena momen akan kembali ke objek tanggal default jika tidak dapat mengurai tanggal. Dan objek tanggal default akan selalu mengembalikan tanggal (bukan yang Anda inginkan.)
Mauvis Ledford

1
perlu menambahkan itu moment('02').isValid() === true, jadi Anda mungkin ingin berhati-hati dengan itu
Bruno Finger

3
Jugamoment('abcde 1').isValid() === true
Amiram Korach

119

var date = moment('2016-10-19', 'DD-MM-YYYY', true);

Anda harus menambahkan argumen ketiga saat meminta momentyang memberlakukan penguraian ketat. Berikut adalah bagian yang relevan dari dokumentasi momen http://momentjs.com/docs/#/parsing/string-format/ Ada di dekat akhir bagian.


Ini tidak berpengaruh.
Billal Begueradj

jawaban ini harus menjadi jawaban yang benar ........ @ Begueradj ini berpengaruh, coba gunakan nilai yang berbeda, terkadang benar dan terkadang salah
Akki

Dan Anda dapat membaca tentang penguraian yang ketat di sini
kuhr

Ini akan membiarkan Anda memasukkan 0000 sebagai tahun
eddy

17

Ini dia: Working Fidddle

$(function(){
  var dateFormat = 'DD-MM-YYYY';
  alert(moment(moment("2012-10-19").format(dateFormat),dateFormat,true).isValid());
});

Seperti yang saya katakan, dateFormat adalah 'DD-MM-YYYY' dan saya tidak diizinkan mengubahnya.
Ganesh

Oh begitu. Biar saya lihat itu.
gschambial

Apakah diperbolehkan untuk mengubah string tanggal di sini 2016-10-19?
gschambial

Nggak. Itu datang dari pemilih tanggal
Ganesh

1
Tidak dapatkah Anda memodifikasinya setelah berasal dari datepicker dan sebelum Anda memasukkannya var d = moment("2016-10-19",dateFormat);?
gschambial

14

Saya menggunakan momen bersama dengan Tanggal baru untuk menangani kasus undefinednilai data:

const date = moment(new Date("2016-10-19"));

karena: moment(undefined).isValid() == true

dimana cara yang lebih baik: moment(new Date(undefined)).isValid() == false



9

Cara memeriksa apakah suatu string adalah tanggal yang valid menggunakan Momen, ketika format tanggal dan tanggal berbeda

Maaf, tetapi apakah salah satu solusi yang diberikan di utas ini benar-benar menjawab pertanyaan yang diajukan?

Saya memiliki tanggal String dan format tanggal yang berbeda. Mis .: tanggal: tanggal: 10-19 2016Format: "DD-MM-YYYY". Saya perlu memeriksa apakah tanggal ini adalah tanggal yang valid.

Berikut ini bekerja untuk saya ...

const date = '2016-10-19';
const dateFormat = 'DD-MM-YYYY';
const toDateFormat = moment(new Date(date)).format(dateFormat);
moment(toDateFormat, dateFormat, true).isValid();

// Note: `new Date()` circumvents the warning that
// Moment throws (https://momentjs.com/guides/#/warnings/js-date/),
// but may not be optimal.

Tapi jujur, tidak mengerti mengapa moment.isDate()( seperti yang didokumentasikan ) hanya menerima suatu objek. Harus juga mendukung string menurut saya.


2
jika kita mengirimkan true sebagai argumen ke-3 untuk saat ini, itu memeriksa format tanggal yang tepat.
Raj Kumar N

2
console.log(` moment('2019-09-01', 'YYYY-MM-DD').isValid()?  ` +moment('2019-09-01', 'YYYY-MM-DD').isValid())
console.log(` moment('2019-22-01', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-01', 'YYYY-DD-MM').isValid())
console.log(` moment('2019-22-22', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-22', 'YYYY-DD-MM').isValid())
console.log(` moment('undefined', 'YYYY-DD-MM').isValid()?  ` +moment('undefined', 'YYYY-DD-MM').isValid())

 moment('2019-09-01', 'YYYY-MM-DD').isValid()?  true
 moment('2019-22-01', 'YYYY-DD-MM').isValid()?  true
 moment('2019-22-22', 'YYYY-DD-MM').isValid()?  false
 moment('undefined', 'YYYY-DD-MM').isValid()?  false

bisakah Anda menambahkan penjelasan pada jawaban Anda? Nilai tambahan apa yang ditambahkan ini ke jawaban yang sudah ada dan diterima?
slfan

0

Jika tanggalnya valid maka getTime()akan selalu sama dengan dirinya sendiri.

var date = new Date('2019-12-12');
if(date.getTime() - date.getTime() === 0) {
    console.log('Date is valid');
} else {
    console.log('Date is invalid');
}

-2

Coba yang ini. Ini tidak bagus tetapi akan berfungsi selama input dalam format konstan dari pemilih tanggal Anda.

Ini adalah badDate yang berasal dari alat pilih Anda dalam contoh ini

https://jsfiddle.net/xs8tvox9/

var dateFormat = 'DD-MM-YYYY'
var badDate = "2016-10-19";

var splittedDate = badDate.split('-');

if (splittedDate.length == 3) {
  var d = moment(splittedDate[2]+"-"+splittedDate[1]+"-"+splittedDate[0], dateFormat);
  alert(d.isValid())
} else {
  //incorrectFormat
}

1
Tolong, jangan lakukan ini.
tdelam
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.