Controlla se la data è valida


124

Di seguito è riportato lo scenario:

Ho una Stringdata e un formato della data diversi. Es .
: data: 2016-10-19
dateFormat: "GG-MM-AAAA".

Devo controllare se questa data è valida.

Ho provato a seguire le cose

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

d.isValid()sta tornando falseogni volta. Moment.js non analizza la data nel formato dato?

Quindi ho provato prima a formattare la data DD-MM-YYYYe poi a passarla a Moment.js:

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

Ora date.isValid()mi sta dando il risultato desiderato, ma qui l'oggetto data Moment.js viene creato due volte. Come posso evitarlo? C'è una soluzione migliore?

Cordiali saluti, non sono autorizzato a modificare il file dateFormat.


Non sei autorizzato a modificare il valore di dateFormat? In tal caso, dovrai modificare il formato dell'input, poiché 2016-10-19 è AAAA-MM-GG, non GG-MM-AAAA. Cosa puoi cambiare?
Pochen

L'input proviene dal selettore di date. Non posso cambiare anche questo :(
Ganesh

1
Posso chiederti perché non sei autorizzato a modificare la variabile dateFormat? var d = momento ("19-10-2016", "GG-MM-AAAA"); risolverebbe i tuoi problemi per quanto mi riguarda
Pochen

davvero non posso dirlo. Ma non è in mio controllo modificare quel valore.
Ganesh

Risposte:


185

Riuscì a trovare la soluzione. Poiché la data che ricevo è in formato ISO, solo fornendo data per momento la convaliderà, non è necessario passare dateFormat.

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

E poi date.isValid()dà il risultato desiderato.


15
Qualcuno sa qual è l'attuale metodo preferito ora? Questo metodo ora genera il seguente "Avviso di deprecazione": la costruzione del momento ricade su js Date. Questo è sconsigliato e verrà rimosso nella prossima versione principale. Fare riferimento a github.com/moment/moment/issues/1407 per maggiori informazioni.
Andrew


4
Solo un avvertimento sul fatto che questo non sempre funziona: var a = moment('12345'); a.isValid() // is truenon funziona perché il momento tornerà all'oggetto data predefinito se non è in grado di analizzare la data. E l'oggetto data predefinito restituirà sempre una data (ma non quella che desideri)
Mauvis Ledford,

1
è necessario aggiungerlo moment('02').isValid() === true, quindi potresti voler stare attento con quello
Bruno Finger

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

119

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

È necessario aggiungere un terzo argomento quando si richiama momentche impone un'analisi rigorosa. Ecco la parte rilevante della documentazione del momento http://momentjs.com/docs/#/parsing/string-format/ È vicino alla fine della sezione.


Questo non ha effetto.
Billal Begueradj

questa risposta dovrebbe essere la risposta corretta ........ @ Begueradj questo ha effetto, prova a usare valori diversi, a volte corretti ea volte sbagliati
Akki

E puoi leggere
sull'analisi

Questo ti permetterà di inserire 0000 come anno
eddy

17

Ecco qui: Working Fidddle

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

Come ho detto, dateFormat è "DD-MM-YYYY" e non sono autorizzato a modificarlo.
Ganesh

Oh, capisco. Fammi vedere su quello.
gschambial

È consentito modificare la stringa della data qui 2016-10-19?
gschambial

No. Viene dal selettore di date
Ganesh

1
Non puoi modificarlo dopo che proviene da datepicker e prima di inserirlo var d = moment("2016-10-19",dateFormat);?
gschambial

14

Uso il momento insieme alla nuova data per gestire casi di undefinedvalori di dati:

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

per colpa di: moment(undefined).isValid() == true

dove come il modo migliore: moment(new Date(undefined)).isValid() == false



9

Come verificare se una stringa è una data valida utilizzando Moment, quando la data e il formato della data sono diversi

Non ho capito, ma qualcuna delle soluzioni fornite in questo thread ha effettivamente risposto alla domanda che è stata posta?

Ho una data stringa e un formato data diverso. Es .: data: 2016-10-19 dateFormat: "GG-MM-AAAA". Devo controllare se questa data è valida.

Quanto segue funziona per me ...

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.

Ma onestamente, non capisco perché moment.isDate()( come documentato ) accetta solo un oggetto. Dovrebbe supportare anche una stringa a mio parere.


2
se passiamo true come terzo argomento per il momento, controlla il formato della data esatto.
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

potresti aggiungere qualche spiegazione alla tua risposta? Quale valore aggiuntivo aggiunge alla risposta già esistente e accettata?
slfan

0

Se la data è valida, getTime()sarà sempre uguale a se stessa.

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

Prova questo. Non è bello ma funzionerà fintanto che l'input è in formato costante dal selettore di date.

È badDate proveniente dal tuo selettore in questo esempio

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
Per favore, non farlo.
tdelam
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.