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.

Ganesh
sumber
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.

Ganesh
sumber
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.

schutta
sumber
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());
});
gschambial.dll
sumber
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

wakeupoj
sumber
11

Saya baru saja menemukan kasus yang benar-benar kacau.

moment('Decimal128', 'YYYY-MM-DD').isValid() // true
Sam Araiza
sumber
15
moment('Decimal128', 'YYYY-MM-DD', true).isValid() // false. Gunakan mode ketat :) momentjs.com/guides/#/parsing/strict-mode
jklemmack
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.

tfmontague
sumber
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
Sande
sumber
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');
}
Tanzeem Bhatti
sumber
-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
}
Pochen
sumber
1
Tolong, jangan lakukan ini.
tdelam