Überprüfen Sie, ob das Datum gültig ist

124

Es folgt das Szenario:

Ich habe ein StringDatum und ein anderes Datumsformat. Bsp.:
Datum: 19.10.2016
DatumFormat: "TT-MM-JJJJ".

Ich muss überprüfen, ob dieses Datum ein gültiges Datum ist.

Ich habe versucht, folgende Dinge zu tun

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

d.isValid()kommt falsejedes Mal zurück. Analysiert Moment.js das Datum nicht im angegebenen Format?

Dann habe ich versucht, das Datum DD-MM-YYYYzuerst zu formatieren und dann an Moment.js zu übergeben:

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

Jetzt date.isValid()gebe ich das gewünschte Ergebnis, aber hier wird das Datumsobjekt Moment.js zweimal erstellt. Wie kann ich das vermeiden? Gibt es eine bessere Lösung?

Zu Ihrer Information, ich darf das nicht ändern dateFormat.

Ganesh
quelle
Dürfen Sie den Wert von dateFormat nicht ändern? In diesem Fall müssen Sie das Format der Eingabe ändern, da der 19.10.2016 JJJJ-MM-TT und nicht TT-MM-JJJJ lautet. Was darfst du ändern?
Pochen
Die Eingabe kommt von der Datumsauswahl. Kann ich auch nicht ändern :(
Ganesh
1
Darf ich fragen, warum Sie die Variable dateFormat nicht ändern dürfen? var d = Moment ("19-10-2016", "TT-MM-JJJJ"); würde Ihre Probleme lösen, soweit es mich betrifft
Pochen
kann ich wirklich nicht sagen. Aber ich kann diesen Wert nicht ändern.
Ganesh
1
Mögliches Duplikat von Wie
Luca Fagioli

Antworten:

185

Konnte die Lösung finden. Da das Datum, das ich erhalte, im ISO-Format vorliegt, wird es nur durch Angabe des Datums bis zum Moment validiert, ohne dass das Datumsformat übergeben werden muss.

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

Und date.isValid()gibt dann das gewünschte Ergebnis.

Ganesh
quelle
15
Weiß jemand, was die derzeit bevorzugte Methode jetzt ist? Diese Methode gibt jetzt die folgende "Verfallswarnung" aus: Die Momentkonstruktion fällt auf js Datum zurück. Dies wird nicht empfohlen und wird in der kommenden Hauptversion entfernt. Weitere Informationen finden Sie unter github.com/moment/moment/issues/1407 .
Andrew
4
Nur ein Hinweis, dass dies nicht immer funktioniert: var a = moment('12345'); a.isValid() // is trueDies schlägt fehl, da der Moment auf das Standard-Datumsobjekt zurückgreift, wenn das Datum nicht analysiert werden kann. Und das Standard-
Datumsobjekt
1
müssen das hinzufügen moment('02').isValid() === true, also möchten Sie vielleicht vorsichtig damit sein
Bruno Finger
3
Auchmoment('abcde 1').isValid() === true
Amiram Korach
118

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

Sie sollten beim Aufrufen ein drittes Argument hinzufügen, das eine momentstrikte Analyse erzwingt. Hier ist der relevante Teil der Momentdokumentation http://momentjs.com/docs/#/parsing/string-format/. Sie befindet sich am Ende des Abschnitts.

schutta
quelle
Dies hat keine Auswirkung.
Billal Begueradj
Diese Antwort sollte die richtige Antwort sein ........ @ Begueradj dies hat Auswirkungen, versuchen Sie es mit anderen Werten, manchmal richtig und manchmal falsch
Akki
Und Sie können über strenge Analyse lesen Sie hier
Kuhr
Auf diese Weise können Sie 0000 als Jahr eingeben
Wirbel
17

Los geht's: Working Fidddle

$(function(){
  var dateFormat = 'DD-MM-YYYY';
  alert(moment(moment("2012-10-19").format(dateFormat),dateFormat,true).isValid());
});
gschambial
quelle
Wie gesagt, das dateFormat ist 'TT-MM-JJJJ' und ich darf es nicht ändern.
Ganesh
Oh ich verstehe. Lassen Sie mich das sehen.
Gschambial
Darf hier die Datumszeichenfolge geändert werden 2016-10-19?
Gschambial
Nee. Das kommt von der Datumsauswahl
Ganesh
1
Können Sie es nicht ändern, nachdem es vom Datepicker stammt und bevor Sie es eingeben var d = moment("2016-10-19",dateFormat);?
Gschambial
14

Ich benutze Moment zusammen mit neuem Datum, um Fälle von undefinedDatenwerten zu behandeln:

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

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

wo als der bessere Weg: moment(new Date(undefined)).isValid() == false

wakeupoj
quelle
11

Ich habe gerade einen wirklich durcheinandergebrachten Fall gefunden.

moment('Decimal128', 'YYYY-MM-DD').isValid() // true
Sam Araiza
quelle
14
moment('Decimal128', 'YYYY-MM-DD', true).isValid() // false. Verwenden Sie den strengen Modus :) momentjs.com/guides/#/parsing/strict-mode
jklemmack
7

So überprüfen Sie mithilfe von Moment, ob eine Zeichenfolge ein gültiges Datum ist, wenn sich Datum und Datumsformat unterscheiden

Entschuldigung, aber hat eine der angegebenen Lösungen in diesem Thread tatsächlich die gestellte Frage beantwortet?

Ich habe ein String-Datum und ein anderes Datumsformat. Bsp.: Datum: 19.10.2016 DatumFormat: "TT-MM-JJJJ". Ich muss überprüfen, ob dieses Datum ein gültiges Datum ist.

Folgendes funktioniert für mich ...

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.

Aber ehrlich gesagt, verstehe nicht, warum moment.isDate()( wie dokumentiert ) nur ein Objekt akzeptiert wird. Sollte meiner Meinung nach auch einen String unterstützen.

tfmontague
quelle
1
Wenn wir true als drittes Argument für den Moment übergeben, wird das genaue Datumsformat überprüft.
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
quelle
Könnten Sie bitte Ihrer Antwort eine Erklärung hinzufügen? Welchen zusätzlichen Wert bringt dies zu der bereits vorhandenen und akzeptierten Antwort?
Slfan
0

Wenn das Datum gültig ist, ist das getTime()immer gleich.

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
quelle
-2

Probier diese. Es ist nicht schön, aber es wird funktionieren, solange die Eingabe von Ihrer Datumsauswahl ein konstantes Format hat.

In diesem Beispiel ist badDate von Ihrem Picker

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
quelle
1
Bitte tu das nicht.
tdelam