2010-09-02 5 views
5

Est-ce que quelqu'un sait pourquoi dans Firefox si vous exécutez le code ci-dessous, il va le valider comme une date si la chaîne transmise est quatre chiffres et seulement quatre numéros? Dans tous les autres navigateurs que j'ai testés (IE, Chrome), il reviendra toujours comme n'étant pas une date. Etant donné que la spécification, comme indiqué par Marcel Korpel ci-dessous, indique qu'il faut se replier pour utiliser la fonction de repli spécifique à l'implémentation de Firefox, je me demande vraiment pourquoi la retombée de Firefox affiche cette anomalie.Javascript date étrangeté entre Firefox et tout le monde

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

S'il vous plaît indenter votre code avec 4 espaces, ne pas utiliser les guirlandes comme vous l'avez fait. –

+0

retourne true dans une branche, et ne retourne rien dans un autre ... ???!? –

+0

Oui, j'essayais de faire une fonction isDate rapide et sale et j'ai oublié d'ajouter dans le retour faux. Laissez-moi juste supprimer le retour vrai pour cette discussion. –

Répondre

4

Si vous passez une chaîne au constructeur Date, la chaîne doit être dans un format reconnu par la méthode parse (IETF-compliant RFC 1123 timestamps) (source: MDC). Tout le reste entraîne un comportement spécifique à l'implémentation et varie selon les navigateurs.

Je vous suggère de ne pas utiliser de chaîne et d'utiliser trois chiffres représentant l'année, le mois et le jour (les numéros de mois commencent à 0 (= janvier)), ou utiliser un nombre, le nombre de millisecondes depuis le 1er janvier 1970 00:00:00 UTC.

MISE À JOUR: voir votre exemple,

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

sorties

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

si Firefox reconnaît apparemment '0123' comme numéro de l'année.

MISE À JOUR 2: Je pense que MDC's description of Date.parse contient la réponse à votre question:

À partir de JavaScript 1.8.5, un sous-ensemble de ISO 8601 chaînes de date au format peut également être analysé.

La page ISO 8601 spécifie (section 'Formats'):

Année:
AAAA (par exemple 1997)
Année et mois:
AAAA-MM (par exemple 1997- 07)
Date complète:
AAAA-MM-JJ (par exemple 1997-07-16)

Ainsi, en se basant sur la norme ISO 8601, une chaîne ne contenant que quatre nombres sera reconnue comme un numéro d'année.

+0

Je comprends que ce n'est pas conforme, je me demandais juste pourquoi Firefox afficherait ce comportement. –

+1

@Brian: c'est juste à cause de ça, son comportement n'est pas spécifié; Selon la spécification [ECMAScript spec] (http://ecma262-5.com/ELS5_Section_15.htm#Section_15.9.4.2), "[i] f la chaîne n'est pas conforme à ce format, la fonction peut revenir à n'importe quelle implémentation heuristiques spécifiques ou formats de date spécifiques à l'implémentation. "Le constructeur' Date' * doit * renvoyer "NaN" si la chaîne n'est pas reconnue comme une date. C'est juste que certains navigateurs sont plus indulgents que d'autres. –

+0

Je suppose que je me demande vraiment pourquoi la méthode de repli spécifique à l'implémentation de Firefox retournera NaN pour '123' mais une date pour '0123'. Devrais-je modifier mon message pour mieux qualifier ma question? –

0

J'ai rencontré le même problème que ce dans Firefox, pour certaines raisons, je ne peux pas expliquer CARactère numériques à 4 chiffres est une date valide dans FF, dans d'autres navigateurs ceci est NaN:

Un peu de travail méchant -après pour FF mais, cela a fonctionné pour moi:

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

Merci pour la solution de contournement! Je pense que je vais utiliser quelque chose comme ça dans mon code. –

1

Ne comptez pas sur la validation de la date en javascript. Le format d'heure de date local peut créer un problème avec l'objet de date javascript.

utilisation d'approche suivante

  • show zone de texte non modifiable
  • sur le focus de l'émission textbox calendrier
  • do validation vide, le champ doit être obligatoire
  • pas nécessaire d'effectuer ce jour validations comme si la valeur de la zone de texte n'est pas vide, ce sera définitivement la date. Nous ne permettons pas à l'utilisateur d'entrer quoi que ce soit d'autre et la valeur choisie dans le calendrier est toujours va être :) Date de
1

Cela fonctionne dans tous les navigateurs -

new Date ('2001/01/31 12:00:00 AM ')

+0

Vous venez de me répondre pourquoi mon objet a échoué lorsque j'ai appliqué la nouvelle création d'objet Date(). Firefox échoue juste quand je passe Dash '-' à lui. Chrome ne le fait pas. Remplacer par '/' a fait le travail – neoswf

Questions connexes