¿Cuál es una manera fácil de verificar si un valor es una fecha válida? Se permite cualquier formato de fecha conocido.
Por ejemplo, tengo los valores 10-11-2009
, 10/11/2009
, 2009-11-10T07:00:00+0000
la que todos deben ser reconocidos como valores de fecha, y los valores 200
, 10
, 350
, que no deben ser reconocidos como un valor de fecha. ¿Cuál es la forma más sencilla de verificar esto, si esto es posible? Porque las marcas de tiempo también estarían permitidas.
javascript
date-format
Thizzer
fuente
fuente
Respuestas:
Sería
Date.parse()
suficiente?Consulte su página relativa de documentación de MDN .
fuente
Date.parse("4.3")
es986270400000
.Actualización 2015
Es una pregunta antigua pero otras preguntas nuevas como:
se cierren como duplicados de este, así que creo que es importante agregar información fresca aquí. Lo escribo porque me asusté pensando que la gente realmente copia y pega parte del código publicado aquí y lo usa en producción.
La mayoría de las respuestas aquí o bien usar expresiones regulares complejas que responden a formatos sólo algunos muy específicos y de hecho lo hacen de forma incorrecta (como ajuste de 32 de enero, cuando no coincida con la fecha ISO real como se anuncia - ver demostración ) o que tratan de pasar nada al
Date
constructor y desear lo mejor.Usando momento
Como expliqué en esta respuesta, actualmente hay una biblioteca disponible para eso: Moment.js
Es una biblioteca para analizar, validar, manipular y mostrar fechas en JavaScript, que tiene una API mucho más rica que las funciones estándar de manejo de fechas de JavaScript.
Tiene 12kB minified / gzipped y funciona en Node.js y otros lugares:
Usando Moment puede ser muy específico sobre la verificación de fechas válidas. A veces es muy importante agregar algunas pistas sobre el formato que espera. Por ejemplo, una fecha como 22/06/2015 parece una fecha válida, a menos que use un formato DD / MM / AAAA, en cuyo caso esta fecha debe rechazarse como no válida. Hay pocas maneras de decirle a Moment qué formato espera, por ejemplo:
El
true
argumento está ahí, por lo que el Momento no intentará analizar la entrada si no se ajusta exactamente a uno de los formatos proporcionados (en mi opinión, debería ser un comportamiento predeterminado).Puede usar un formato provisto internamente:
Y puede usar múltiples formatos como una matriz:
Ver: DEMO .
Otras bibliotecas
Si no desea usar Moment.js, también hay otras bibliotecas:
Actualización 2016
He creado el immoment módulo que es como (un subconjunto de) Momento pero sin sorpresas causadas por mutación de objetos existentes (véase la documentación para obtener más información).
Actualización 2018
Hoy recomiendo usar Luxon para la manipulación de fecha / hora en lugar de Moment, que (a diferencia de Moment) hace que todos los objetos sean inmutables, por lo que no hay sorpresas desagradables relacionadas con la mutación implícita de fechas.
Más información
Ver también:
Una serie de artículos de Rob Gravelle en las bibliotecas de análisis de fechas de JavaScript:
Línea de fondo
Por supuesto, cualquier persona puede tratar de reinventar la rueda, escribir una expresión regular (pero por favor, lea realmente la norma ISO 8601 y RFC 3339 antes de hacerlo) o llame al buit-en los constructores con datos aleatorios a los mensajes de error de análisis como
'Invalid Date'
(¿Estás seguro de que este mensaje es exactamente igual en todas las plataformas, en todos los entornos locales, en el futuro, o puede usar una solución probada y usar su tiempo para mejorarla, no reinventarla. Todas las bibliotecas enumeradas aquí son de código abierto, software libre.fuente
moment("whatever 123").isValid()
vuelvetrue
.moment("06/22/2015", "DD/MM/YYYY", true).isValid();
con el formato de fecha esperado provisto explícitamente y con un argumento quetrue
significa verificación estricta. Actualicé mi respuesta con más información y mejores ejemplos.Así es como resolví este problema en una aplicación en la que estoy trabajando ahora:
actualizado en base a los comentarios de krillgar:
fuente
new Date(date)
no le da 'Fecha inválida'.new Date(date) !== "Invalid Date"
será siempre volver cierto ya que la expresión izquierda devolverá un objeto Date con un TimeValue de NaN , que nunca puede ser===
una cadena. Usando==
"obras" debido a la conversión de tipos. Pero dado que el análisis de las cadenas de fecha todavía depende en gran medida de la implementación, depender de él para analizar formatos aleatorios con defectos serios.isDate('Mac OS X 10.14.2')
vuelve verdadero aquí.new Date(date) === 'Invalid Date'
solo funciona en Firefox y Chrome. IE8 (el que tengo en mi máquina con fines de prueba) proporciona NaN.Como se indicó a la respuesta aceptada,
Date.parse(date)
también funcionará para los números. Entonces, para evitar eso, también puede verificar que no sea un número (si eso es algo que desea confirmar).fuente
isNan
no es una función; caso incorrecto en primera instancia.date
es asíFoostreet 1
, su condición se evalúa como verdadera.¿Qué tal algo como esto? Probará si es un objeto Date o una cadena de fecha:
Debo mencionar que esto no prueba las cadenas con formato ISO, pero con un poco más de trabajo para el RegExp debería ser bueno.
fuente
Ninguna de las respuestas aquí se dirige a verificar si la fecha no es válida, como el 31 de febrero. Esta función se ocupa de verificar si el mes devuelto es equivalente al mes original y asegurarse de que se haya presentado un año válido.
fuente
Use la expresión regular para validarlo.
fuente
Al referirme a todos los comentarios anteriores, he llegado a una solución.
Esto funciona si el
Date
pase está en formato ISO o necesita manipularse para otros formatos.Puedes jugar aquí en JSFiddle.
fuente
YYYY-MM-DD
, por lo que es trivial adjuntarT00:00:00.000Z
y usar esta solución para verificar cadenas válidas.Aquí hay una función mejorada que solo usa
Date.parse()
:Nota: Date.parse () analizará los números: por ejemplo
Date.parse(1)
, devolverá una fecha. Así que aquí verificamos sis
no es un número, si es una fecha.fuente
Yo haría esto
Juega aqui
fuente
EXAMPLE STRING 12345
y devuelve "Fecha válida".Aquí hay una versión minimalista.
fuente
isDate(" 1")
Esta función invocable funciona perfectamente, devuelve verdadero para la fecha válida. Asegúrese de llamar utilizando una fecha en formato ISO (aaaa-mm-dd o aaaa / mm / dd):
fuente
return !isNaN(Date.parse(isoDate)) || isoDate == new Date(isoDate).toISOString().substr(0,10);
Sé que es una pregunta antigua, pero enfrenté el mismo problema y vi que ninguna de las respuestas funcionó correctamente, específicamente eliminando números (1,200,345, etc.) de las fechas, que es la pregunta original. Aquí hay un método poco ortodoxo en el que podría pensar y parece funcionar. Indique si hay casos en los que fallará.
Esta es la línea para eliminar los números. Por lo tanto, toda la función podría verse así:
fuente
console.log("hello 1 ", isDate("hello 1 "));
vuelve verdadero¿está bien verificar que una función relacionada con la fecha esté disponible para que el objeto encuentre si es un objeto de fecha o no?
me gusta
fuente
Así es como termino haciéndolo. Esto no cubrirá todos los formatos. Tienes que ajustar en consecuencia. Tengo control sobre el formato, así que funciona para mí.
fuente
Ok, esta es una vieja pregunta, pero encontré otra solución mientras comprobaba las soluciones aquí. Para mí, funciona para verificar si la función getTime () está presente en el objeto de fecha:
fuente
Una biblioteca ligera está lista para ti: Day.js
fuente
Por defecto, esto se establece en VERDADERO. Entonces, incluso las cadenas de formato incorrecto devuelven buenos valores.
Lo he usado algo como esto:
fuente
Prueba esto:
fuente