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?

cuongle
la source
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
3
@CuongLe Avez-vous vu cette question: stackoverflow.com/questions/9062863/…
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.

Petr Abdulin
la source
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.

Bergi
la source
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).

Sergio Abreu
la source
-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')

MSIslam
la source
-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

MJ Storm
la source