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.

Ganesh
fuente
¿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.

Ganesh
fuente
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.

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

wakeupoj
fuente
11

Acabo de encontrar un caso realmente desordenado.

moment('Decimal128', 'YYYY-MM-DD').isValid() // true
Sam Araiza
fuente
14
moment('Decimal128', 'YYYY-MM-DD', true).isValid() // false. Use el modo estricto :) momentjs.com/guides/#/parsing/strict-mode
jklemmack
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.

tfmontague
fuente
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
Sande
fuente
¿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');
}
Tanzeem Bhatti
fuente
-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
}
Pochen
fuente
1
Por favor, no hagas esto.
tdelam