2010-09-02 4 views
5

¿Alguien sabe por qué en Firefox si ejecutas el código de abajo lo validará como una fecha si la cadena ingresada tiene cuatro números y solo cuatro? En todos los otros navegadores que probé con (IE, Chrome) siempre se devolverá como no una fecha.Amenaza de fecha de Javascript entre Firefox y todos los demás

Siendo que la especificación, como señala Marcel Korpel a continuación, indica que debería recurrir al uso específico de la implementación de Firefox. Realmente me pregunto por qué la caída de Firefox muestra esta anomalía.

function isDate(sDate) { 
    var temp = new Date(sDate); 
    if (temp.toString() == "NaN" || temp.toString() == "Invalid Date") { 
     alert("Not a Date"); 
    } else { 
     alert("Is a Date!"); 
    } 
} 
+0

Indique su código con 4 espacios, no use los palos de retroceso como lo hizo. –

+0

devuelve true en una rama y no devuelve nada en otra ... ??? –

+0

Sí, estaba tratando de hacer una función isDate rápida y sucia y olvidé agregar la devolución falsa. Permítanme eliminar la declaración verdadera para esta discusión. –

Respuesta

4

Si pasa una cadena al Date constructor, la cadena debe estar en un formato reconocido por el método parse (IETF-compliant RFC 1123 timestamps) (fuente: MDC). Todo lo demás da como resultado un comportamiento específico de implementación y variará según los navegadores.

le sugiero que no utiliza cuerdas en absoluto y, o bien utiliza tres números que representan el año, mes y día (importa que el número del mes comienzan a 0 (= enero)), o el uso de un número, el número de milisegundos desde el 1 de enero de 1970 a las 00:00:00 UTC.

ACTUALIZACIÓN: ver su ejemplo,

var a = new Date('0123'); 
console.log(a); 

salidas

Fri Jan 01:00:00 GMT+0100 (CET) 

por eso Firefox aparentemente reconoce '0123' como un número de años.

ACTUALIZACIÓN 2: Creo MDC's description of Date.parse contiene la respuesta a su pregunta:

A partir de JavaScript 1.8.5, un subconjunto de ISO 8601 cadenas de fecha con formato también se puede analizar.

la norma ISO 8601 página especifica (sección 'Formatos'):

Año:
AAAA (por ejemplo, 1997)
año y mes:
AAAA-MM (por ejemplo, 1997- 07)
fecha completa:
AAAA-MM-DD (por ejemplo, 1997-07-16)

Por lo tanto, al confiar en ISO 8601, una cadena que solo contenga cuatro números se reconocerá como un número de año.

+0

Entiendo que no es compatible, solo me preguntaba por qué Firefox mostraría este comportamiento. –

+1

@Brian: es solo por eso, su comportamiento no está especificado; de acuerdo con [especificación ECMAScript] (http://ecma262-5.com/ELS5_Section_15.htm#Section_15.9.4.2), "[i] f la Cadena no se ajusta a ese formato, la función puede recurrir a cualquier implementación heurística específica o formatos de fecha específicos de implementación. "El constructor' Date' * debe * devolver 'NaN' si la cadena no se reconoce como una fecha. Es solo que algunos navegadores son más indulgentes que otros. –

+0

Supongo que realmente estoy preguntando por qué la implementación específica de Firefox devolverá NaN para '123' pero una fecha para '0123'. ¿Debo editar mi publicación para calificar mejor mi pregunta? –

0

me he encontrado con el mismo problema que con esto en Firefox, por algunas razones por las que no puede explicar caracteres cualquier 4 dígitos numéricos es una fecha válida en FF, en otros navegadores esto es NaN:

Un poco trabajo desagradable -algo para FF pero, esto funcionó para mí:

function isDate(sDate) { 
    if(sDate.match(/^\d{4}$/)) 
     return false; 
    var temp = new Date(sDate); 
    if (temp.toString() == "NaN" || temp.toString() == "Invalid Date") { 
     alert("Not a Date"); 
    } else { 
     alert("Is a Date!"); 
     return true; 
    } 
} 
+0

¡Gracias por la solución! Creo que usaré algo así en mi código también. –

1

No confíe en la validación de fecha en javascript. El formato de fecha y hora local puede crear algún problema con el objeto de fecha de javascript.

uso siguiente enfoque

  • espectáculo cuadro de texto no editable
  • el foco de la caja de texto calendario de exposiciones
  • hacer la validación vacío, el campo tiene que ser obligatorio
  • hay necesidad de realizar fecha validaciones como si el valor del cuadro de texto no estuviera vacío, definitivamente será la fecha. No estamos permitiendo al usuario introducir cualquier otra cosa y el valor seleccionado en el calendario es siempre a estar :) Fecha
1

Esto funciona en todos los navegadores -

new Date ('2001/01/31 12:00:00 a.m.)

+0

Usted acaba de darme la respuesta de por qué mi objeto falló cuando apliqué en él la creación de un nuevo objeto Date(). Firefox solo falla cuando le paso a Dash '-'. Chrome no. Reemplazar a '/' hizo el trabajo – neoswf

Cuestiones relacionadas