Compruebe si la fecha es válida


124

El siguiente es el escenario:

Tengo una Stringfecha y un formato de fecha que es diferente. Ej .
: fecha: 2016-10-19
dateFormat: "DD-MM-AAAA".

Necesito verificar si esta fecha es válida.

He intentado seguir las siguientes cosas

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

d.isValid()Está volviendo falsecada vez. ¿Moment.js no analiza la fecha en el formato dado?

Luego intenté formatear la fecha DD-MM-YYYYprimero y luego pasarla a Moment.js:

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

Ahora date.isValid()me está dando el resultado deseado, pero aquí el objeto de fecha Moment.js se crea dos veces. ¿Cómo puedo evitar esto? ¿Hay una mejor solución?

FYI no tengo permitido cambiar el dateFormat.


¿No está permitido cambiar el valor de dateFormat? En ese caso, deberá cambiar el formato de la entrada, ya que 2016-10-19 es AAAA-MM-DD, no DD-MM-AAAA. ¿Qué se te permite cambiar?
Pochen

La entrada proviene del selector de fecha. No puedo cambiar eso también :(
Ganesh

1
¿Puedo preguntar por qué no puede cambiar la variable dateFormat? var d = momento ("19-10-2016", "DD-MM-AAAA"); resolvería sus problemas en lo que a mí respecta
Pochen

Realmente no puedo decir. Pero eso no está bajo mi control para cambiar ese valor.
Ganesh

Respuestas:


185

Pude encontrar la solución. Dado que la fecha que obtengo está en formato ISO, solo proporcionar la fecha al momento lo validará, no es necesario pasar el dateFormat.

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

Y luego date.isValid()da el resultado deseado.


15
¿Alguien sabe cuál es el método preferido actual ahora? Este método ahora arroja la siguiente "Advertencia de desaprobación": la construcción del momento vuelve a ser js Date. Esto se desaconseja y se eliminará en el próximo lanzamiento principal. Consulte github.com/moment/moment/issues/1407 para obtener más información.
Andrew


44
Solo un aviso de que esto no siempre funciona: var a = moment('12345'); a.isValid() // is trueesto falla porque el momento volverá al objeto de fecha predeterminado si no puede analizar la fecha. Y el objeto de fecha predeterminado siempre devolverá una fecha (simplemente no la que desea).
Mauvis Ledford

1
necesita agregar eso moment('02').isValid() === true, por lo que es posible que tenga cuidado con eso
Bruno Finger

3
Tambiénmoment('abcde 1').isValid() === true
Amiram Korach

119

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

Debería agregar un tercer argumento al invocar momentque imponga un análisis estricto. Aquí está la parte relevante de la documentación del momento http://momentjs.com/docs/#/parsing/string-format/ Está cerca del final de la sección.


Esto no tiene efecto.
Billal Begueradj

esta respuesta debe ser la respuesta correcta ........ @ Begueradj esto tiene efecto, intente usar diferentes valores, a veces correctos y a veces incorrectos
Akki

Y puedes leer sobre análisis estricto aquí
kuhr

Esto le permitirá ingresar 0000 como año
eddy

17

Aquí tienes: Working Fidddle

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

Como dije, el dateFormat es 'DD-MM-AAAA' y no se me permite cambiarlo.
Ganesh

Oh ya veo. Déjame ver eso.
gschambial

¿Está permitido cambiar la cadena de fecha aquí 2016-10-19?
gschambial

No Eso viene del recolector de fechas
Ganesh

1
¿No puede modificarlo después de que proviene de datepicker y antes de ingresarlo var d = moment("2016-10-19",dateFormat);?
gschambial

14

Uso momento junto con la nueva Fecha para manejar casos de undefinedvalores de datos:

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

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

donde como la mejor manera: moment(new Date(undefined)).isValid() == false



8

Cómo verificar si una cadena es una fecha válida usando Moment, cuando la fecha y el formato de fecha son diferentes

Lo sentimos, pero ¿alguna de las soluciones dadas en este hilo realmente respondió la pregunta que se hizo?

Tengo una fecha de cadena y un formato de fecha que es diferente. Ej .: fecha: 2016-10-19 dateFormat: "DD-MM-AAAA". Necesito verificar si esta fecha es válida.

Lo siguiente funciona para mí ...

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.

Pero, sinceramente, no entiendo por qué moment.isDate()( como se documenta ) solo acepta un objeto. También debería admitir una cadena en mi opinión.


1
si pasamos true como tercer argumento por el momento, verificará el formato de fecha exacto.
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

¿podría por favor agregar alguna explicación a su respuesta? ¿Qué valor adicional agrega esto a la respuesta ya existente y aceptada?
slfan

0

Si la fecha es válida getTime(), siempre será igual a sí misma.

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

Prueba este. No es agradable, pero funcionará siempre que la entrada sea un formato constante desde su selector de fecha.

Es malo La fecha que viene de su selector en este ejemplo

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
Por favor, no hagas esto.
tdelam
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.