Ü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.


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.


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.


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());
});

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



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.


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

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');
}

-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
}

1
Bitte tu das nicht.
tdelam
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.