108 votes

new Date() fonctionne dans Chrome mais pas dans Firefox

Je crée une chaîne de date qui ressemble à ceci : 2010-07-15 11:54:21

Et avec le code suivant, j'obtiens une date invalide dans Firefox mais fonctionne parfaitement dans Chrome.

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);

Dans firefox, date1 me donne une date invalide, mais dans chrome, cela fonctionne très bien. Quelle en serait la cause principale ?

2 votes

Si vous voulez jouer avec de la manière que vous voulez, allez-y. datejs.com

0 votes

Toutes les implémentations ne prennent pas en charge le format de l'ECMA-262. Il faut donc toujours analyser manuellement les chaînes de caractères (une bibliothèque peut aider mais n'est probablement pas nécessaire pour les formats uniques).

0 votes

Cela fonctionne avec Firefox maintenant.

87voto

Chris Laplante Points 18060

Vous ne pouvez pas instancier un objet date comme vous le souhaitez. Il faut le faire d'une manière spécifique. Voici quelques exemples valables :

new Date() // current date and time
new Date(milliseconds) //milliseconds since 1970/01/01
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)

ou

d1 = new Date("October 13, 1975 11:13:00")
d2 = new Date(79,5,24)
d3 = new Date(79,5,24,11,33,0)

Chrome doit juste être plus flexible.

Source : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Desde apsillers commentaire :

la spécification EMCAScript requiert exactement un format de date (c'est-à-dire AAAA-MM-DDTHH:mm:ss.sssZ) mais les formats de date personnalisés peuvent être librement pris en charge par une mise en œuvre. : " Si la chaîne n'est pas conforme à ce format [défini par ECMAScript], la fonction peut se rabattre sur toute heuristique ou format de date spécifique à l'implémentation. " Chrome et FF ont simplement des " formats de date spécifiques à l'implémentation " différents.

4 votes

J'ai trouvé une solution qui fonctionne dans tous les navigateurs, y compris Firefox : stackoverflow.com/a/21984717/586051

8 votes

Quant à savoir pourquoi cette différence entre les navigateurs existe : la spécification EMCAScript requiert exactement un format de date (c'est-à-dire, YYYY-MM-DDTHH:mm:ss.sssZ ) mais les formats de date personnalisés peuvent être librement pris en charge par une mise en œuvre. : " Si la chaîne n'est pas conforme à ce format [défini par ECMAScript], la fonction peut se rabattre sur toute heuristique ou format de date spécifique à l'implémentation. " Chrome et FF ont simplement des " formats de date spécifiques à l'implémentation " différents.

0 votes

Un exemple de format de date (mois incluant un ".") qui fonctionne dans Chrome mais pas dans Firefox : 14 février 2019

29voto

Tahin Rahman Points 170

Cela fonctionne dans tous les navigateurs -

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

new Date('2001-01-31 12:00:00')

Format : AAAA-MM-DDTHH:mm:ss.sss

Détails : http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

0 votes

Parce que nous savons tous que c'est une norme internationale. w3.org/International/questions/qa-date-format

6 votes

Donc vous avez réellement testé tous les navigateurs ? Et en supposant que vous l'ayez fait, vous savez également que tous les navigateurs à l'avenir supporteront également ce format (non standard) ?

1 votes

Cela fonctionne pour moi. Donc, si vous obtenez déjà une chaîne de '2001-1-31 12:00:00', nous pouvons simplement faire : new Date(str.replace(/-/g, '/')) ;

14voto

Alvis Points 384

Cela fonctionne également dans la plupart des navigateurs

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

C'est le format de

"yyyy/MM/dd HH:mm:ss"

3 votes

Il n'y a aucune garantie que ce format fonctionnera dans n'importe quel navigateur, et encore moins dans "tous".

0 votes

Vous avez raison sur ce point, la réponse est basée sur mon expérience.

8voto

Gabrielius Points 63

Si vous souhaitez toujours créer une date en utilisant des tirets, vous pouvez utiliser ce format :

var date = new Date('2013-08-31T17:00:00Z')

Mais gardez à l'esprit qu'il crée l'heure selon l'UTC. Autrement dit, si vous vivez dans le fuseau horaire GMT+3 (3 heures d'avance sur l'heure GMT), il ajoutera ce décalage horaire à l'heure. Ainsi, l'exemple ci-dessus aura cette valeur, si vous êtes en GMT+3 (notez que l'heure est 20:00 et non 17:00) :

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)

Veillez à ajouter la lettre 'Z' à la fin, car sinon Chrome et Firefox analyseront la chaîne différemment (l'un ajoutera le décalage horaire et l'autre non).

1 votes

Oui, chrome et firefox se comportent différemment si vous ne fournissez pas de fuseau horaire. Et, par intérêt, je pense que firefox le fait mal. Il devrait supposer l'heure GMT si le fuseau horaire est absent. Chrome le fait, pas firefox. ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

0 votes

@JulianJelfs-" Il doit supposer l'heure GMT si le fuseau horaire est absent ", uniquement pour la date (contrairement à la norme ISO 8601). Pour les chaînes de date et d'heure, il devrait supposer qu'elles sont locales (conformément à la norme ISO 8601). Mais dans tous les cas, l'analyse manuelle est le seul moyen sûr de procéder.

5voto

SnapShot Points 2409

Je rencontrais un problème similaire dans Firefox et Safari lorsque je travaillais avec AngularJS. Par exemple, si une date renvoyée par Angular ressemblait à ceci :

2014-06-02 10:28:00

en utilisant ce code :

new Date('2014-06-02 10:28:00').toISOString();

renvoie une erreur de date invalide dans Firefox et Safari. En revanche, il fonctionne parfaitement dans Chrome. Comme l'a indiqué une autre réponse, Chrome est probablement plus souple dans l'analyse des chaînes de date.

Mon objectif final était de formater la date d'une certaine manière. J'ai trouvé une excellente bibliothèque qui gère à la fois le problème de la compatibilité entre navigateurs et celui du formatage de la date. Cette bibliothèque s'appelle moment.js .

En utilisant cette bibliothèque, le code suivant fonctionne correctement sur tous les navigateurs que j'ai testés :

moment('2014-06-02 10:28:00').format('MMM d YY')

Si vous êtes prêt à inclure cette bibliothèque supplémentaire dans votre application, vous pourrez construire plus facilement votre chaîne de dates tout en évitant les éventuels problèmes de compatibilité avec les navigateurs. En prime, vous disposerez d'un bon moyen pour formater, ajouter, soustraire, etc. les dates si nécessaire.

0 votes

Vous devez toujours transmettre le format à moment.js lors de l'analyse syntaxique des chaînes de caractères, sinon, il se contente de deviner jusqu'à ce qu'il en trouve une qui crée une date valide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X