2008-10-02 13 views
29

J'ai un problème Javascript Date() -constructeur ne fonctionne pas

Le constructeur Date("mm-dd-yyyy") javascript ne fonctionne pas pour FF. Cela fonctionne bien pour IE.

  • IE: new Date("04-02-2008") =>"Wed Apr 2 00:00:00 EDT 2008"
  • FF2: new Date("04-02-2008") =>Invalid Date

permet donc d'essayer un autre constructeur. Essayer ce constructeur Date("yyyy", "mm", "dd")

  • IE: new Date("2008", "04", "02"); =>"Fri May 2 00:00:00 EDT 2008"
  • FF: new Date("2008", "04", "02"); =>"Fri May 2 00:00:00 EDT 2008"
  • IE: new Date("2008", "03", "02"); =>"Wed Apr 2 00:00:00 EDT 2008"
  • FF: new Date("2008", "03", "02"); =>"Wed Apr 2 00:00:00 EDT 2008"

Alors le constructeur Date("yyyy", "mm", "dd") utilise un inde x de 0 pour représenter Janvier.

Est-ce que quelqu'un a traité avec ceci?
Il doit y avoir une meilleure façon que de soustraire 1 des mois.

Répondre

44

C'est le definition of the Date object d'utiliser les valeurs 0-11 pour le champ month. Je crois que le constructeur utilisant une chaîne est dépendant du système (sans parler de la locale/de la fuseau horaire) donc il vaut mieux utiliser le constructeur où vous spécifiez l'année/mois/jour comme paramètres séparés.

BTW, dans Firefox,

new Date("04/02/2008"); 

fonctionne bien pour moi - il interprétera des barres obliques, mais pas de traits d'union. Je pense que cela prouve mon point que l'utilisation d'un String pour construire un objet Date est problématique. Utilisez des valeurs explicites pour le mois/jour/année à la place:

new Date(2008, 3, 2); 
1

Vous avez raison, le mois est indiqué comme un indice, si Janvier est numéro du mois 0 et Décembre est numéro 11 mois ...

- et il n'y a pas de travail autour comme il est dit clairement dans le ECMA-script définition, bien que des trucs simples souvent travailler:

var myDate = "2008,03,02".split(","); 
var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]); 
alert(theDate); 
17

astuce en effet, que je viens de découvrir la dure (en pensant à travers elle). Mais j'ai utilisé une plus naturelle chaîne de date avec trait d'union :-)

var myDateArray = "2008-03-02".split("-"); 
var theDate = new Date(myDateArray[0],myDateArray[1]-1,myDateArray[2]); 
alert(theDate); 
3

En utilisant

var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]); 

est très bien, mais il montre quelques comportements étranges lorsque les valeurs de mois et le jour sont erronées. Essayez de lancer une date où les deux myDate[1]-1 et myDate[2] ont des valeurs de 55. Javascript renvoie toujours une date, bien que l'entrée ne soit évidemment pas correcte.

J'aurais préféré javascript pour renvoyer une erreur dans un tel cas.

2

@Frank: vous avez raison. Lorsque vous devez valider la date,

var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]); 

ne fonctionnera pas.

Ce qui se passe est qu'il continue à ajouter le paramètre supplémentaire. Par exemple:

new Date("2012", "11", "57") // Date {Sat Jan 26 2013 00:00:00 GMT+0530 (IST)} 

L'objet date prend les jours supplémentaires (57-31 = 26) et l'ajoute à la date que nous avons créée.

Ou si nous essayons de construire un objet rendez-vous avec:

new Date("2012", "11", "57", "57") //Date {Mon Jan 28 2013 09:00:00 GMT+0530 (IST)} 

2 jours supplémentaires et 9 heures (57 = 24 + 24 + 9) sont ajoutés.