Me gustaría decir la diferencia entre objetos de fecha válidos e inválidos en JS, pero no pude entender cómo:
var d = new Date("foo");
console.log(d.toString()); // shows 'Invalid Date'
console.log(typeof d); // shows 'object'
console.log(d instanceof Date); // shows 'true'
¿Alguna idea para escribir una isValidDate
función?
- Ash se recomienda
Date.parse
para analizar cadenas de fecha, lo que proporciona una forma autorizada de verificar si la cadena de fecha es válida. - Lo que preferiría, si es posible, es que mi API acepte una instancia de Date y pueda verificar / afirmar si es válida o no. La solución de Borgar hace eso, pero necesito probarlo en todos los navegadores. También me pregunto si hay una forma más elegante.
- Ash me hizo considerar no tener mi API para aceptar
Date
instancias, esto sería más fácil de validar. - Borgar sugirió probar para una
Date
instancia, y luego probar elDate
valor de tiempo del 's. Si la fecha no es válida, el valor del tiempo esNaN
. Verifiqué con ECMA-262 y este comportamiento está en el estándar, que es exactamente lo que estoy buscando.
javascript
date
orip
fuente
fuente
return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
Respuestas:
Así es como lo haría:
Actualización [2018-05-31] : si no le preocupan los objetos Date de otros contextos JS (ventanas externas, marcos o marcos flotantes), se puede preferir esta forma más simple:
fuente
d.getTime
soloisNan(d)
d instanceof Date && !isNaN(d.getTime())
1
por ejemplo, todavía tendría una fecha válida,Mon Jan 01 2001 00:00:00
que de hecho es una fecha, sin embargo, para el propósito de mi aplicación, es completamente inútil . Por lo tanto, se necesita más validación de entrada en mi caso al menos. Esta respuesta valida undateObject
no aDate
!En lugar de usar
new Date()
, debe usar:Date.parse()
devuelve una marca de tiempo, un número entero que representa el número de milisegundos desde el 01 / enero / 1970. VolveráNaN
si no puede analizar la cadena de fecha proporcionada.fuente
Date.parse
depende de la implementación y definitivamente no se debe confiar para analizar cadenas de fechas generales. No hay un formato único que se analice correctamente en los navegadores populares, y mucho menos todos los que están en uso (aunque eventualmente el formato ISO8601 especificado en ES5 debería estar bien).new Date('foo')
que es básicamente equivalente con elDate.parse('foo')
método. Ver: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Entonces, lo que dijo @RobG, también se aplica a él.Puede verificar la validez de un
Date
objeto ad
través dePara evitar problemas de marcos cruzados, uno podría reemplazar el
instanceof
cheque conUna llamada al
getTime()
igual que en la respuesta de Borgar es innecesario, ya queisNaN()
yisFinite()
tanto convertir implícitamente al número.fuente
isFinite()
está,toString.call()
es solo un reemplazo para lainstanceof
parte del chequeisFinite
másisNaN
(ambos funcionan bien conDate(Infinity)
). Por otra parte, si desea que la condición opuesta, se pone un poco más simple:if (!(date instanceof Date) || isNaN(date))
.Mi solución es simplemente verificar si obtiene un objeto de fecha válido:
Implementación
Uso
fuente
isNaN
es una forma más explícita de realizar pruebas de NaNisNaN("a") === true
, mientras("a" !== "a") === false
. Vale la pena pensarlo. +1new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time)
. Si está pasando una cadena al constructor de la fecha, debe pasar una cadena estandarizada para obtener un resultado confiable. Específicamente, "La cadena debe estar en un formato reconocido por el método Date.parse ()". developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…respuesta más corta para verificar la fecha válida
fuente
date && !isNaN(date.getTime())
date
no es del tipo Fecha. Por ejemplo:var date = 4; date && !isNaN(date.getTime());
.date instanceof Date && !isNaN(date.getTime())
Simplemente puede usar moment.js
Aquí hay un ejemplo:
La sección de validación en la documentación es bastante clara.
Y también, los siguientes indicadores de análisis dan como resultado una fecha no válida:
overflow
: Un desbordamiento de un campo de fecha, como un 13º mes, un 32º día del mes (o un 29 de febrero en años no bisiestos), un 367º día del año, etc., el desbordamiento contiene el índice de la unidad no válida para que coincida con #invalidAt (ver más abajo); -1 significa que no hay desbordamiento.invalidMonth
: Un nombre de mes no válido, como momento ('marzo', 'MMMM') ;. Contiene la cadena de mes inválida o nula.empty
: Una cadena de entrada que no contiene nada analizable, como momento ('esto no tiene sentido') ;. BooleanoFuente: http://momentjs.com/docs/
fuente
moment("11/06/1986", "DD/MM/YYYY").isValid();
Me gustaría mencionar que el widget jQuery UI DatePicker tiene un método de utilidad de validación de fecha muy bueno que verifica el formato y la validez (por ejemplo, no se permiten fechas 01/33/2013).
Incluso si no desea utilizar el widget de selector de fecha en su página como un elemento de la interfaz de usuario, siempre puede agregar su biblioteca .js a su página y luego llamar al método de validación, pasando el valor que desea validar en él. Para hacer la vida aún más fácil, se necesita una cadena como entrada, no un objeto Fecha de JavaScript.
Ver: http://api.jqueryui.com/datepicker/
No aparece en la lista como método, pero está allí, como una función de utilidad. Busque en la página "parsedate" y encontrará:
$ .datepicker.parseDate (formato, valor, configuración): extrae una fecha de un valor de cadena con un formato especificado.
Ejemplo de uso:
(Más información sobre cómo especificar formatos de fecha se encuentra en http://api.jqueryui.com/datepicker/#utility-parseDate )
En el ejemplo anterior, no vería el mensaje de alerta ya que '01 / 03/2012 'es una fecha válida de calendario en el formato especificado. Sin embargo, si hizo 'stringval' igual a '13 / 04/2013 ', por ejemplo, recibirá el mensaje de alerta, ya que el valor '13 / 04/2013' no es válido para el calendario.
Si un valor de cadena pasado se analiza correctamente, el valor de 'testdate' sería un objeto de Fecha Javascript que representa el valor de cadena pasado. Si no, sería indefinido.
fuente
Realmente me gustó el enfoque de Christoph (pero no tenía suficiente reputación para votarlo). Para mi uso, sé que siempre tendré un objeto Date, así que simplemente extendí la fecha con un método válido ().
Ahora puedo escribir esto y es mucho más descriptivo que simplemente verificar isFinite en el código ...
fuente
isFinite
trabajo me funcionó perfectamente. Pero sí, no tiene sentido extender el prototipo.!isFinite
en unaDate
voluntad captar el hecho de queDate
esInvalid Date
. También vale la pena señalar que mi contexto está dentro de Node.fuente
Puede verificar el formato válido de txDate.value con este scirpt. si estaba en formato incorrecto, la fecha no obedece y devuelve nulo a dt.
Y como sugirió @ MiF en breve
fuente
Utilizo el siguiente código para validar valores para año, mes y fecha.
Para más detalles, consulte Comprobar fecha en javascript
fuente
str
No se está utilizando.Demasiadas respuestas complicadas aquí ya, pero una línea simple es suficiente (ES5):
o incluso en ES6:
fuente
Date.parse(true)
, obtengo correctamente un NaN.Vi algunas respuestas que se acercaron mucho a este pequeño fragmento.
Forma JavaScript:
Forma TypeScript:
fuente
Buena solución! Incluido en mi biblioteca de funciones auxiliares, ahora se ve así:
fuente
Esto solo funcionó para mí
Sin embargo esto no funcionó
fuente
`${new Date('foo')}` === 'Invalid Date'
Para proyectos de Angular.js puede usar:
fuente
Ninguna de estas respuestas funcionó para mí (probada en Safari 6.0) al intentar validar una fecha como el 2/31/2012, sin embargo, funcionan bien al intentar cualquier fecha mayor que 31.
Así que tuve que forzar un poco la fuerza bruta. Asumiendo que la fecha está en el formato
mm/dd/yyyy
. Estoy usando la respuesta @broox:fuente
&& value.split('/')[0] == (d.getMonth()+1);
new Date('string date')
es equivalente aDate.parse('string date')
, vea: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… para que pueda obtener valores falsos verdaderos o falsos.Ninguna de las soluciones anteriores funcionó para mí, lo que sí funcionó es
el código anterior verá cuando JS convierte el 31/02/2012 en 02/03/2012 que no es válido
fuente
fuente
He escrito esta función. Páselo como un parámetro de cadena y determinará si es una fecha válida o no según este formato "dd / MM / aaaa".
aquí hay una prueba
entrada: "jajaja", salida: falso.
entrada: "29/2/2000", salida: verdadero.
entrada: "29/2/2001", salida: falso.
fuente
Date.prototype.toISOString
tiradasRangeError
(al menos en Chromium y Firefox) en fechas no válidas. Puede usarlo como un medio de validación y puede que no lo necesiteisValidDate
como tal (EAFP). De lo contrario es:fuente
Inspirado por el enfoque de Borgar, me he asegurado de que el código no solo valide la fecha, sino que también se asegure de que la fecha sea una fecha real, lo que significa que fechas como 31/09/2011 y 29/02/2011 no están permitidas.
fuente
dd/MM/yyyy
notación. Además, regresatrue
cuando es válido y,'Invalid date!'
si no lo es, mejor devuelve solo 1 tipo.Combiné los mejores resultados de rendimiento que encontré alrededor de esa verificación si un objeto dado:
El resultado es el siguiente:
fuente
Date object to string es una forma más simple y confiable de detectar si ambos campos son fecha válida. por ejemplo, si ingresa este "-------" en el campo de entrada de fecha. Algunas de las respuestas anteriores no funcionarán.
fuente
La respuesta seleccionada es excelente, y la estoy usando también. Sin embargo, si está buscando una forma de validar la entrada de la fecha del usuario, debe tener en cuenta que el objeto Date es muy persistente para convertir los argumentos de construcción no válidos en válidos. El siguiente código de prueba de unidad ilustra el punto:
fuente
Llámalo así
fuente
Una función lista basada en la respuesta mejor calificada:
fuente
Solución simple y elegante:
fuentes:
[1] https://medium.com/@esganzerla/simple-date-validation-with-javascript-caea0f71883c
[2] Fecha incorrecta mostrada en la nueva Fecha () en JavaScript
fuente
date.getDate() == day
es insuficiente para determinar si la fecha es válida. El formato de fecha original devolverá una fecha no válida en algunas implementaciones, independientemente de si la fecha es válida o no. También "1970-01-01 00:00" si se analiza correctamente devolverá falso (es decir,Boolean(+new Date("1970-01-01"))
devuelve falso).const date = new Date(year, month, day);
Tenga en cuenta que el mes es 0 indexado de esta manera, por lo que es posible que deba restar uno para alinearlo correctamente.Creo que algo de esto es un proceso largo. Podemos acortarlo como se muestra a continuación:
fuente
Para componentes basados en int 1 de una fecha:
Pruebas:
fuente