Tarihin geçerli olup olmadığını kontrol edin


124

Senaryo aşağıdadır:

Bir Stringtarihim ve farklı bir tarih biçimim var. Ör .:
tarih: 2016-10-19
dateFormat: "GG-AA-YYYY".

Bu tarihin geçerli bir tarih olup olmadığını kontrol etmem gerekiyor.

Aşağıdaki şeyleri denedim

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

d.isValid()falseher seferinde geri dönüyor . Moment.js, tarihi verilen formatta ayrıştırmaz mı?

Sonra önce tarihi biçimlendirmeyi DD-MM-YYYYve ardından Moment.js'ye geçirmeyi denedim:

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

Şimdi date.isValid()bana istenen sonucu veriyor, ancak burada Moment.js tarih nesnesi iki kez oluşturuldu. Bundan nasıl kaçınabilirim? Daha iyi bir çözüm var mı?

Bilginize. Öğesini değiştirmeme izin verilmiyor dateFormat.


DateFormat değerini değiştirmenize izin verilmiyor mu? Bu durumda, 2016-10-19 YYYY-AA-GG olduğundan GG-AA-YYYY değil, girişin formatını değiştirmeniz gerekecektir. Neyi değiştirebilirsin?
pochen

Giriş, tarih seçiciden geliyor. Bunu da değiştiremezsin :(
Ganesh

1
DateFormat değişkenini neden değiştirmenize izin verilmediğini sorabilir miyim? var d = an ("19-10-2016", "GG-AA-YYYY"); Sorunlarınızı bildiğim kadarıyla
çözerim

gerçekten söyleyemem. Ama bu değeri değiştirmek benim kontrolümde değil.
Ganesh

Yanıtlar:


185

Çözümü bulabildim. Aldığım tarih ISO biçiminde olduğundan, yalnızca şu an için tarih sağlamak onu doğrulayacaktır, dateFormat'ı geçmeye gerek yoktur.

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

Ve sonra date.isValid()istenen sonucu verir.


15
Şu anda tercih edilen mevcut yöntemin ne olduğunu bilen var mı? Bu yöntem artık aşağıdaki "Kullanımdan Kaldırma Uyarısı" nı atar: an oluşturma anı js Tarihine geri döner. Bu önerilmemektedir ve sonraki ana sürümde kaldırılacaktır. Daha fazla bilgi için lütfen github.com/moment/moment/issues/1407 adresine bakın .
Andrew


4
Bunun her zaman işe yaramayacağına dair bir uyarı: var a = moment('12345'); a.isValid() // is trueBu başarısız olur, çünkü tarihi ayrıştıramazsa an varsayılan tarih nesnesine geri döner. Ve varsayılan tarih nesnesi her zaman bir tarih döndürür (yalnızca istediğinizi değil)
Mauvis Ledford

1
bunu eklemeniz gerekiyor moment('02').isValid() === true, bu yüzden buna dikkat etmek isteyebilirsiniz
Bruno Finger

3
Ayrıcamoment('abcde 1').isValid() === true
Amiram Korach

119

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

momentSıkı ayrıştırmayı zorunlu kılan üçüncü bir bağımsız değişken eklemelisiniz . İşte anlık dokümantasyonun ilgili kısmı http://momentjs.com/docs/#/parsing/string-format/ Bölümün sonuna yakın.


Bunun hiçbir etkisi yoktur.
Billal Begueradj

bu cevap doğru cevap olmalı ........ @ Begueradj bunun bir etkisi var, farklı değerler kullanmayı deneyin, bazen doğru bazen yanlış
Akki


Bu, yıl olarak 0000 girmenize izin verir
girdap

17

İşte gidiyorsun: Working Fidddle

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

Dediğim gibi dateFormat 'GG-AA-YYYY' ve onu değiştirmeme izin verilmiyor.
Ganesh

Ah anlıyorum. Bir bakayım.
gschambial

Burada tarih dizesini değiştirmeye izin var 2016-10-19mı?
gschambial

Hayır! Bu tarih seçiciden geliyor
Ganesh

1
Tarih seçiciden geldikten sonra ve onu girmeden önce onu değiştiremez var d = moment("2016-10-19",dateFormat);misiniz?
gschambial

14

undefinedVeri değerleri durumlarını işlemek için anı yeni Date ile birlikte kullanıyorum :

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

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

nerede daha iyi bir yol: moment(new Date(undefined)).isValid() == false



9

Tarih ve tarih biçimi farklı olduğunda, Moment kullanılarak bir dizenin geçerli bir tarih olup olmadığı nasıl kontrol edilir

Pardon ama bu ileti dizisinde verilen çözümlerden herhangi biri sorulan soruyu gerçekten yanıtladı mı?

Bir String tarihim ve farklı bir tarih formatım var. Ör .: tarih: 2016-10-19 dateFormat: "GG-AA-YYYY". Bu tarihin geçerli bir tarih olup olmadığını kontrol etmem gerekiyor.

Aşağıdakiler benim için çalışıyor ...

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.

Ama dürüst olmak gerekirse, neden moment.isDate()( belgelendiği gibi ) yalnızca bir nesneyi kabul ettiğini anlamayın . Bence bir dizeyi de desteklemeli.


2
an için 3. argüman olarak true değerini iletirsek, kesin tarih formatını kontrol eder.
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

Lütfen cevabınıza bir açıklama ekler misiniz? Bu, halihazırda var olan ve kabul edilen yanıta ne ek değer katar?
slfan

0

Tarih geçerliyse getTime(), her zaman kendisine eşit olacaktır.

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

Bunu dene. Bu hoş değil, ancak giriş tarih seçicinizden gelen sabit formatta olduğu sürece çalışacaktır.

Bu örnekte seçicinizden kötü tarih geliyor

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
Lütfen bunu yapma.
tdelam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.