Moment: Impossible de trouver l'abréviation du fuseau horaire dans Date.prototype.toString ()

Créé le 6 févr. 2012  ·  33Commentaires  ·  Source: moment/moment

Bonjour, je suis tombé sur le site moment.js via un forum et j'ai cliqué dessus, quand je suis tombé sur le test unitaire - qui a échoué 2 tests ce que je veux signaler ici:

Agent utilisateur:
Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.7 (KHTML, comme Gecko) Chrome / 16.0.912.77 Safari / 535.7 (Chrome 16.0.912.77 m)

Fuseau horaire:
UTC + 1

Tests échoués (# 28):
http://pastebin.com/bQsDuxdH

* Titre édité par timrwood

Bug

Commentaire le plus utile

Question stupide: pourquoi une toute nouvelle bibliothèque? Le but de Moment n'est-il pas de résoudre tous ses besoins en matière de gestion de la date et de l'heure? Alors que les fichiers de données ajoutent une quantité d'espace non négligeable (et je peux comprendre les séparer), la nouvelle bibliothèque elle-même est <2k, donc l'espace ne semble pas être une raison pour la séparer.

Il semble juste un peu triste que quelqu'un qui souhaite simplement générer une chaîne de date avec un fuseau horaire doive télécharger deux bibliothèques séparées et un fichier de données pour faire ce que Javascript devrait avoir intégré.

Aussi, comment utiliser cette nouvelle fusion de bibliothèques pour générer une simple chaîne de date? Avant j'aurais pu générer:

Sun, 06 Nov 1994 08:49:37 GMT

avec:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

Mais maintenant, je ne sais pas comment je suis censé faire cela sans l'option de formatage "z". Toute aide serait appréciée.

Tous les 33 commentaires

Hmm, il semble que l'abréviation du fuseau horaire échoue. Désolé de faire le débogage à distance, mais quelle est la sortie de ce qui suit dans Chrome?

new Date().toString()

De plus, quel est le nom du fuseau horaire dans lequel vous vous trouvez?

J'obtiens la même erreur dans les tests unitaires et je suis également en UTC + 1 (anciennement GMT + 1).

nouvelle Date (). toString () affiche "Sat 11 février 2012 02:15:10 GMT + 0100" dans Firefox 10, "Sat 11 février 2012 02:18:29 GMT + 0100 (heure normale d'Europe occidentale)" dans Chrome 16 et "Sat Feb 11 02:18:59 UTC + 0100 2012" dans Internet Explorer 9

Hmm, j'avais peur de ça. Le problème est que Date.prototype.toString renvoie des résultats aussi différents. C'est le seul endroit pour obtenir le nom du fuseau horaire (PST, CST, EST, etc.). Si cette méthode ne renvoie aucune information de fuseau horaire (comme c'est le cas avec FF10 et IE9, il n'y a aucun moyen de l'obtenir.

Il est peut-être temps de se déprécier? Ou est-il acceptable de simplement noter le problème dans la documentation?

4318 réussis, 2 échoués. 2715 millisecondes.

Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 535.11 (KHTML, comme Gecko) Chrome / 17.0.963.56 Safari / 535.11

UTC +2 (Kiev, Ukraine)

le format du fuseau horaire 2 est passé, 2 échoué
---> Quelque chose comme "PST"
AssertionError: ---> Quelque chose comme "PST"
sur Object.ok (http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
à http://momentjs.com/js/tests.js?_=120203_183019:2413:14
à Object.runTest (http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
à http://momentjs.com/js/tests.js?_=120203_183019:1748:25
à http://momentjs.com/js/tests.js?_=120203_183019:1006:13
à http://momentjs.com/js/tests.js?_=120203_183019:616:13
à http://momentjs.com/js/tests.js?_=120203_183019:627:25
à http://momentjs.com/js/tests.js?_=120203_183019:1008:17
à http://momentjs.com/js/tests.js?_=120203_183019:1589:17
---> Quelque chose comme "PST"
AssertionError: ---> Quelque chose comme "PST"
sur Object.ok (http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
à http://momentjs.com/js/tests.js?_=120203_183019:2414:14
à Object.runTest (http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
à http://momentjs.com/js/tests.js?_=120203_183019:1748:25
à http://momentjs.com/js/tests.js?_=120203_183019:1006:13
à http://momentjs.com/js/tests.js?_=120203_183019:616:13
à http://momentjs.com/js/tests.js?_=120203_183019:627:25
à http://momentjs.com/js/tests.js?_=120203_183019:1008:17
à http://momentjs.com/js/tests.js?_=120203_183019:1589:17
+02: 00 ---> Quelque chose comme "+07: 30"
+0200 ---> Quelque chose comme "+0700"

J'obtiens également le même test échoué # 28. Mon fuseau horaire est GMT -3.

Agent:
Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.11 (KHTML, comme Gecko) Chrome / 17.0.963.66 Safari / 535.11

Échec du test: http://pastebin.com/dsWHMF3h

.:.

Agent:
Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 10.0.2) Gecko / 20100101 Firefox / 10.0.2
ou
Mozilla / 5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4. 0C; Zune 4.7; .NET4.0E)

Échec du test: http://pastebin.com/6t6JP9fu

On dirait donc que cela se produit en UTC + 1, UTC + 2 et UTC-3.

Malheureusement, il existe maintenant un moyen de résoudre ce problème. Cela dépend du piratage de la sortie Date().toString() , et s'il n'y a aucune information de fuseau horaire disponible dans cette chaîne, il n'y a aucun moyen d'obtenir ces informations.

Je vais déprécier cette fonctionnalité et peut-être créer un plugin qui aura des résultats plus fiables (bien que peut-être moins précis). Cela devrait probablement être quelque chose comme https://github.com/mde/timezone-js.

Les jetons z zz sont obsolètes à partir de 1.6.0. Je ferme ce problème en conséquence.

Qu'en est-il de node.js? Est-ce que z zz fiable ou non dans cet environnement?

Ils sont officiellement obsolètes, ils ne fonctionneront donc pas à partir de la version 1.6.0.

Pour les versions de code antérieures, j'imagine que les résultats seraient également incohérents, car Node utilise V8 et certains des résultats incohérents ci-dessus sont dans Chrome, qui utilise également V8.

Merci. Donc, pour une chaîne comme Thu Jan 10 2013 22:54:11 GMT+0100 (CET) , ce que j'ai fini par faire est de supprimer avec une expression rationnelle la chaîne de fuseau horaire (ici (CET) avec l'espace au début) et de ne laisser que les informations de décalage temporel (ici +0100 ). Pensez-vous que cela suffit pour moment.js ou est-ce que je risque des incohérences?

Hmm, je ne suis pas sûr de ce que vous essayez de faire, essayez-vous d'obtenir CET ou +0100 ?

+0100 est pris en charge via le jeton ZZ (notez la majuscule) et fonctionne bien lors de l'analyse et du formatage.

CET était obsolète car nous ne pouvions pas l'obtenir de manière fiable à partir de Date.toString . Cependant, comme nous utilisons Date.getTimezoneOffset pour +0100 , le support est beaucoup plus cohérent.

Je fais ce que vous dites, en utilisant ZZ pour +0100 et en supprimant CET de la chaîne à analyser. Est-ce que ça fait du sens ?

Mes excuses, je ne comprends toujours pas quel est le problème ici. Essayez-vous d'analyser Thu Jan 10 2013 22:54:11 GMT+0100 (CET) ? Vous devriez pouvoir faire ce qui suit.

moment('Thu Jan 10 2013 22:54:11 GMT+0100 (CET)', 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');

C'est exactement ce que je fais à la fin. On dirait que vous confirmez que je fais la bonne chose. Mes excuses Si je n'étais pas clair, merci pour les réponses!

Aucun problème!

@ hughanderson4 , le problème était que les navigateurs ne renvoient pas toujours une abréviation de fuseau horaire à partir de Date.prototype.toString . Comme nous ne pouvions pas obtenir de manière fiable l'abréviation du fuseau horaire, elle a été déconseillée.

Depuis lors, moment-timezone a été créé pour ajouter la prise en charge du fuseau horaire pour moment.js. Vous voudrez peut-être examiner cela pour voir si cela répond à vos besoins.

Comment convertir un moment.utc () en heure locale et afficher l'abréviation du fuseau horaire?

Question stupide: pourquoi une toute nouvelle bibliothèque? Le but de Moment n'est-il pas de résoudre tous ses besoins en matière de gestion de la date et de l'heure? Alors que les fichiers de données ajoutent une quantité d'espace non négligeable (et je peux comprendre les séparer), la nouvelle bibliothèque elle-même est <2k, donc l'espace ne semble pas être une raison pour la séparer.

Il semble juste un peu triste que quelqu'un qui souhaite simplement générer une chaîne de date avec un fuseau horaire doive télécharger deux bibliothèques séparées et un fichier de données pour faire ce que Javascript devrait avoir intégré.

Aussi, comment utiliser cette nouvelle fusion de bibliothèques pour générer une simple chaîne de date? Avant j'aurais pu générer:

Sun, 06 Nov 1994 08:49:37 GMT

avec:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

Mais maintenant, je ne sais pas comment je suis censé faire cela sans l'option de formatage "z". Toute aide serait appréciée.

Alors, demandez juste pour être sûr de bien comprendre: il n'y a pas de remplacement pour le format obsolète «z»?

Si j'ai un horodatage au format ISO-8601, tel que:

2014-07-25T18:00:00-04:00

Et je veux afficher cet horodatage comme suit:

6:00 PM EST

Moment ne prend-il plus en charge ce formatage? Toutes les données de fuseau horaire sont incluses dans mon horodatage, et je veux seulement les afficher directement sans transformer le fuseau horaire en aucune façon.

Cela n'inclut pas réellement le fuseau horaire. Il peut y avoir plusieurs noms de fuseau horaire qui correspondent au même décalage UTC, en particulier lorsque l'on considère les possibilités de varier l'heure d'été. Vous ne pouvez pas déduire de "UTC-4: 00" que le fuseau horaire est EST.

Pour plus de précision, le formateur z fonctionne toujours lors de l'utilisation du fuseau horaire avec un

En mentionnant simplement ceci maintenant - si vous utilisez
new Date().toTimeString()
vous obtenez le même résultat sur tous les navigateurs dans la mesure où j'ai essayé.

Cela signifie que vous pourriez éventuellement utiliser cette chaîne pour extraire le fuseau horaire, non?

Salut, je vois ci-dessus que le format («z») est obsolète. également dans les documents moment, je vois qu'il est obsolète à partir de 1.6.0. J'utilise maintenant 2.11.0, je peux utiliser le «z» pour afficher le fuseau horaire (PST / PDT) en fonction du décalage.
Dois-je ne pas utiliser ce «z» dans mon code maintenant? pouvez-vous s'il vous plaît dire une alternative exacte pour afficher PST au lieu de - / + 8

@themakshter - non, vous n'obtenez pas le même résultat sur tous les navigateurs. Le système d'exploitation, la version du navigateur et la langue jouent un rôle important - et il n'y a aucune exigence de cohérence dans la spécification.

@ Shobana16 - Si vous faites juste moment().format('z') , il retournera toujours "" .

Si vous utilisez moment-fuseau horaire et faites quelque chose comme moment.tz('America/Los_Angeles').format('z') , vous obtiendrez une réponse valide.

z convient avec le fuseau horaire instantané. Il ne fait rien sur un moment clair.

Merci pour les commentaires MJ. Ouais, j'utilise «z» avec le fuseau horaire du moment uniquement. Ok cool restera mon code avec 'z'. !

Juste une note à ajouter, à partir du moment-fuseau horaire 0.5.0, vous pouvez _ deviner_ au fuseau horaire local, ce qui ouvre la porte à:

var abbreviation = moment.tz(moment.tz.guess()).format('z');

C'est correct, mais sachez que:

  1. C'est juste une supposition. Cela pourrait se tromper.
  2. En cas d'erreur, il est toujours possible que l'abréviation soit correcte, car de nombreux fuseaux horaires similaires utiliseront les mêmes abréviations, telles que la façon dont Europe/Paris et Europe/Berlin utilisent tous les deux CET et CEST .
  3. Cependant, il n'y a aucune garantie. S'il se trompe, vous pourriez présenter la mauvaise abréviation.

Nous pourrions également envisager d'adapter moment.js de telle sorte que si moment-fuseau horaire est disponible, il puisse essayer de le faire automatiquement pour réactiver le formateur z . Bien que cela ne se produise pas actuellement.

var abbreviation = moment.tz(moment.tz.guess()).format('zz'); ne semble pas fonctionner (avec deux z s). Suis-je capable de récupérer uniquement "EDT" et non "Eastern Daylight Time"?

Merci!

Ahhh, j'ai trouvé que http://momentjs.com/timezone/docs/#/using -timezones / formatting / dit: Pour fournir des noms de forme longue, vous pouvez remplacer moment.fn.zoneName et utiliser le zz jeton.
[and much more...]
Merci.

Une chose est cependant déroutante. Dans la version actuelle (ou comme il est indiqué "à partir de 1.6.0 "), il n'y a aucun moyen d'afficher le fuseau horaire sans utiliser un fuseau horaire distinct. Mais quand je fais moment(...).toString() cela montre par exemple GMT à la fin. Alors, est-ce un bug ou une solution contredit une autre fonctionnalité?

Une chose est cependant déroutante. Dans la version actuelle (ou comme il est indiqué "à partir de 1.6.0 "), il n'y a aucun moyen d'afficher le fuseau horaire sans utiliser un fuseau horaire distinct. Mais quand je fais moment(...).toString() cela montre par exemple GMT à la fin. Alors, est-ce un bug ou une solution contredit une autre fonctionnalité?

Je pense que le problème est la fiabilité. Moment ne peut pas extraire de manière fiable le fuseau horaire correct de l'objet de date local et ne prend donc plus en charge z/zz dans sa mise en forme.

Discuté ci-dessus:
https://github.com/moment/moment/issues/162#issuecomment -4060027

C'est ce qui a fonctionné pour nous pour obtenir le texte "GMT" puisque z est obsolète

const dateGenerated = moment("2020-05-20 08:15:25");
const localDateGenerated = dateGenerated.local().format('DD MMM YYYY hh:mm A') + ' ' + String(dateGenerated.local()._d).split(' ')[5];

Cela générera 20 May 2020 08:15 AM GMT+0300"

Cette page vous a été utile?
0 / 5 - 0 notes