new Date () fonctionne différemment dans Chrome et Firefox


94

Je veux convertir la chaîne de date Dateen javascript, utilisez ce code:

var date = new Date('2013-02-27T17:00:00');
alert(date);

'2013-02-27T17:00:00' est l'heure UTC dans l'objet JSON du serveur.

Mais le résultat du code ci-dessus est différent entre Firefox et Chrome:

Firefox renvoie:

Wed Feb 27 2013 17:00:00 GMT+0700 (SE Asia Standard Time)

Chrome renvoie:

Thu Feb 28 2013 00:00:00 GMT+0700 (SE Asia Standard Time) 

C'est différent 1 jour, le résultat correct auquel je m'attendais est le résultat de Chrome.

Code de démonstration: http://jsfiddle.net/xHtqa/2/

Comment puis-je résoudre ce problème pour obtenir le même résultat des deux?


2
Est-ce que c'est sur le même ordinateur?
Aaron Digulla

4
@Sandeep, le point principal est que Chrome ajoute un décalage de fuseau horaire alors que Firefox ne le fait pas
paramètres régionaux par défaut


1
C'est Date {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)}pour moi dans les deux (Linux).
marekful

1
Le coin de Nitpicker: «Heure UTC au format JSON» - Format JSON? Précisément, une plainte courante concernant JSON est qu'il ne définit aucun format de date.
Álvaro González

Réponses:


66

Le format correct pour UTC serait 2013-02-27T17:00:00Z(Z est pour l'heure Zulu). Ajoutez Zsi non présent pour obtenir la chaîne de date et heure UTC correcte.


2
Merci. Cela marche. Mais il y a un journal disant qu'il sera obsolète à l'avenir !!!. Une idée s'il vous plaît?
Débora

1
merci beaucoup, je suis assis avec ce problème depuis deux jours, mais ce message a tout résolu.
Piyal George

30

Oui, malheureusement, les algorithmes d'analyse des dates dépendent de l'implémentation. D'après la spécification deDate.parse (qui est utilisée par new Date):

La chaîne peut être interprétée comme une heure locale, une heure UTC ou une heure dans un autre fuseau horaire, selon le contenu de la chaîne. La fonction tente d'abord d'analyser le format de la chaîne selon les règles appelées dans le format de chaîne de date et d'heure ( 15.9.1.15 ). Si la chaîne n'est pas conforme à ce format, la fonction peut revenir à n'importe quelle heuristique spécifique à l'implémentation ou aux formats de date spécifiques à l'implémentation.

Pour empêcher le Dateconstructeur d' utiliser (peut-être) le fuseau horaire local, utilisez une chaîne datetime avec des informations sur le fuseau horaire, par exemple "2013-02-27T17:00:00Z". Cependant, il est difficile de trouver un format fiable analysé par chaque navigateur - le format ISO n'est pas reconnu par IE <8 (voir JavaScript: Quels navigateurs prennent en charge l'analyse de la chaîne de date ISO-8601 avec Date.parse ). Mieux, utilisez un horodatage unix, c'est-à-dire des millisecondes depuis l' époque unix , ou utilisez une expression régulière pour décomposer la chaîne en ses parties, puis les insérer Date.UTC.


2
Mais la spécification (15.9.1.15) dit en fait: "La valeur d'un décalage de fuseau horaire absent est" Z "" - donc il ne devrait PAS dépendre de l'implémentation
sinelaw

12
OK, correction. On dirait une erreur dans la spécification ES5.1 - l'intention était de correspondre à ISO-8601 où Z manquant signifie l'heure locale (donc Chrome correspond à ES5.1, Firefox et IE correspondent à ISO-8601)
sinelaw

@sinelaw: Merci d'avoir approfondi ce point. Cependant, indépendamment de ce que disent les spécifications, les [anciens] navigateurs le font toujours différemment :-)
Bergi

2
Bizarrement, l'utilisation de Date.Parse par rapport à la nouvelle date a résolu le problème que j'avais où Chrome convertirait la date dans le fuseau horaire local au lieu de la traiter comme déjà dans le fuseau horaire local.
KingOfHypocrites

1
@ KingOfHypocrites - c'est un peu étrange car appeler le constructeur Date avec une chaîne est censé être identique à l'utilisation de Date.parse .
RobG

4

J'ai trouvé une chose ici. Il semble que la console Firefox Inspector native puisse avoir un bogue: si j'exécute "new Date ()" dans l'Inspecteur natif, il affiche une date avec un fuseau horaire incorrect, les paramètres régionaux GMT, mais exécutant la même commande dans la console d'extension Firebug, la date illustré utilise mon fuseau horaire correct (GMT-3: 00).


-2

Essayez d'utiliser moment.js. Cela fonctionne très bien et de la même manière avec tous les navigateurs. est livré avec de nombreuses options de formatage. utilisez moment ('date'). format ("") au lieu de New Date ('date')


-2

Remarqué que FireFox ne retournait pas le même résultat que Chrome. On dirait que le format que vous utilisez dans kendo.toString pour la date fait une différence.

Le dernier résultat de la console est ce dont j'avais besoin:

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.