Pregunta Detectando una instancia de fecha de "fecha no válida" en JavaScript


Me gustaría decir la diferencia entre objetos de fecha válidos e inválidos en JS, pero no pude averiguar 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'

Cualquier idea para escribir un isValidDate ¿función?

  • Ash recomendado Date.parse para analizar cadenas de fechas, lo que proporciona una manera 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 fecha y pueda verificar / afirmar si es válida o no. La solución de Borgar lo hace, pero debo probarlo en todos los navegadores. También me pregunto si hay una manera más elegante.
  • Ash me hizo considerar no tener mi API aceptada Date instancias en absoluto, esto sería más fácil de validar.
  • Borgar sugirió pruebas para un Date instancia, y luego probar para el Datevalor de tiempo de Si la fecha no es válida, el valor de tiempo es NaN. Lo revisé con ECMA-262 y este comportamiento está en el estándar, que es exactamente lo que estoy buscando.

1081
2017-08-30 11:34


origen


Respuestas:


Así es como lo haría:

if (Object.prototype.toString.call(d) === "[object Date]") {
  // it is a date
  if (isNaN(d.getTime())) {  // d.valueOf() could also work
    // date is not valid
  } else {
    // date is valid
  }
} else {
  // not a date
}

Actualización [2018-05-31]: Si no le preocupan los objetos Date de otros contextos JS (ventanas externas, marcos o iframes), se puede preferir esta forma más simple:

function isValidDate(d) {
  return d instanceof Date && !isNaN(d);
}

885
2017-08-30 11:48



En lugar de usar new Date() Deberías usar:

var timestamp = Date.parse('foo');

if (isNaN(timestamp) == false) {
  var d = new Date(timestamp);
}

Date.parse() devuelve una marca de tiempo, un número entero que representa el número de milisegundos desde 01 / ene / 1970. Regresará NaN si no puede analizar la cadena de fecha proporcionada.


210
2017-08-30 11:47



Puede verificar la validez de un Date objeto d vía

d instanceof Date && isFinite(d)

Para evitar problemas de fotogramas cruzados, uno podría reemplazar el instanceof Comprobar con

Object.prototype.toString.call(d) === '[object Date]'

Una llamada a getTime() como en La respuesta de Borgar es innecesario ya isNaN() y isFinite() ambos se convierten implícitamente en número.


88
2017-08-30 14:07



Mi solución es simplemente verificar si obtienes un objeto de fecha válido:

Implementación

Date.prototype.isValid = function () {
    // An invalid date object returns NaN for getTime() and NaN is the only
    // object not strictly equal to itself.
    return this.getTime() === this.getTime();
};  

Uso

var d = new Date("lol");

console.log(d.isValid()); // false

d = new Date("2012/09/11");

console.log(d.isValid()); // true

66
2017-09-11 15:03



la respuesta más corta para verificar la fecha válida

if(!isNaN(date.getTime()))

49
2017-07-04 10:10



Puedes simplemente usar moment.js

Aquí hay un ejemplo:

var m = moment('2015-11-32', 'YYYY-MM-DD');
m.isValid(); // false

los 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 hacer coincidir #invalidAt (ver a continuación); -1 significa que no hay desbordamiento.
  • invalidMonth: Un nombre de mes no válido, como moment ('Marbruary', 'MMMM') ;. Contiene la cadena de mes no válida en sí, o de lo contrario nulo.
  • empty: Una cadena de entrada que no contiene nada que pueda analizarse, como el momento ('esto no tiene sentido'); Booleano
  • Etc.

Fuente: http://momentjs.com/docs/


35
2017-10-14 20:18



Me gustaría mencionar que el widget jQuery UI DatePicker tiene un muy buen método de utilidad de validación de fecha que verifica el formato y la validez (por ejemplo, no se permiten fechas del 01/33/2013).

Incluso si no desea usar el widget datepicker en su página como un elemento UI, siempre puede agregar su biblioteca .js a su página y luego llamar al método del validador, pasando el valor que desea validar en él. Para hacer que la vida sea aún más fácil, se necesita una cadena como entrada, no un objeto Date de JavaScript.

Ver: http://api.jqueryui.com/datepicker/

No está listado como un 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:

var stringval = '01/03/2012';
var testdate;

try {
  testdate = $.datepicker.parseDate('mm/dd/yy', stringval);
             // Notice 'yy' indicates a 4-digit year value
} catch (e)
{
 alert(stringval + ' is not valid.  Format must be MM/DD/YYYY ' +
       'and the date value must be valid for the calendar.';
}

(Se encuentra más información sobre cómo especificar formatos de fecha 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 para el calendario en el formato especificado. Sin embargo, si hiciera 'stringval' igual a '13 / 04/2013 ', por ejemplo, obtendría el mensaje de alerta, ya que el valor '13 / 04/2013' no es válido para el calendario.

Si un valor de cadena transferido se analiza correctamente, el valor de 'testdate' sería un objeto Javascript Date que represente el valor de cadena transferido. Si no, sería indefinido.


35
2018-02-15 19:30



Realmente me gustó el enfoque de Christoph (pero no tuve suficiente reputación como para votarlo). Para mi uso, sé que siempre tendré un objeto Date, así que simplemente extendí la fecha con un método válido ().

Date.prototype.valid = function() {
  return isFinite(this);
}

Ahora puedo escribir esto y es mucho más descriptivo que solo ver isFinite en el código ...

d = new Date(userDate);
if (d.valid()) { /* do stuff */ }

22
2017-11-23 19:47



Uso el siguiente código para validar los valores de año, mes y fecha.

function createDate(year, month, _date) {
  var d = new Date(year, month, _date);
  if (d.getFullYear() != year 
    || d.getMonth() != month
    || d.getDate() != _date) {
    throw "invalid date";
  }
  return d;
}

Para más detalles, consulte Verificar la fecha en javascript


15
2017-10-27 09:55