Comment puis-je convertir une date en heure GMT?
Comment convertir une date de différents fuseaux horaires à l'heure GMT 0? Disons que j'ai les dates comme ce
Fri Jan 20 2012 11:51:36 GMT-0500
Fri Jan 20 2012 11:51:36 GMT-0300
Fri Jan 20 2012 11:51:36 GMT+0500
à
Fri Jan 20 2012 06:51:36 GMT
Fri Jan 20 2012 08:51:36 GMT
Fri Jan 20 2012 16:51:36 GMT
ce sont des dates que je reçois via new Date().toString()
sur différents fuseaux horaires. Est-il un js méthode de détection de fuseau horaire et de les convertir en conséquence?
EDIT: Le deuxième des trois dates ne sont pas le GMT converti temps des trois premiers. Par exemple, Fri Jan 20 2012 11:51:36 GMT-0500
en GMT est Fri Jan 20 2012 16:51:36 GMT
pas Fri Jan 20 2012 06:51:36 GMT
. GMT-0500 est derrière GMT, pas à l'avance, de sorte que vous devez ajouter le décalage pour obtenir GMT, pas le soustraire.
Vous devez vous connecter pour publier un commentaire.
[Mise à jour]
Matt Johnson réponse est beaucoup mieux que celui-ci a été.
https://stackoverflow.com/a/26454317/334274
getTimezoneOffset
retourne un décalage basé sur la date à laquelle il est appelé, et le fuseau horaire de l'ordinateur, le code est en cours d'exécution sur. Il n' pas offre le décalage passés lors de la construction d'une date à partir d'une chaîne. Aussi - en Ajoutant le décalage de la date timestamp comme montré ici est juste va décaler le moment dans le temps que vous travaillez avec. Il va toujours de retour de la chaîne de résultats en fonction du fuseau horaire de l'ordinateur local à l'aide de ce fuseau horaire de l'heure d'été règles de temps.Vous pouvez simplement utiliser la
toUTCString
(outoISOString
) les méthodes de l'objet date.Exemple:
Si vous préférez un meilleur contrôle du format de sortie, pensez à utiliser une bibliothèque comme date-pnr ou moment.js.
Aussi, dans votre question, vous avez réellement converti le temps de manière incorrecte. Lorsque le décalage est indiqué dans un timestamp de la chaîne, cela signifie que les valeurs de date et heure dans la chaîne ont déjà été ajusté par rapport à l'heure UTC en fonction de cette valeur. Pour revenir à l'UTC, inverser le signe avant d'appliquer le décalage.
toGMTString()
est déconseillé detoUTCString()
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...Bien qu'il semble logique, l'on a accepté la réponse est incorrecte parce que JavaScript dates ne fonctionne pas comme ça.
Il est super important de noter ici que la valeur numérique d'une date (c'est à dire,
new Date()-0
ouDate.now()
) en JavaScript est toujours mesurée comme millseconds depuis l'époque qui est un fuseau horaire sans quantité, basées sur un précis de l'instant exact dans l'histoire de l'univers. Vous n'avez pas besoin d'ajouter ou de soustraire quoi que ce soit à la valeur numérique retourné à partir deDate()
pour convertir la valeur numérique dans un fuseau horaire, parce que la valeur numérique a pas de fuseau. Si elle avait eu un fuseau horaire, tout le reste en JavaScript dates ne fonctionnerait pas.Fuseaux horaires, les années bissextiles, les secondes intercalaires, et tous les autres à l'infini compliqué ajustements à nos locaux le temps et les dates, sont basés sur cette cohérent et sans ambiguïté valeur numérique, et non pas l'inverse.
Ici sont des exemples de la façon dont la valeur numérique d'une date (prévue à la date du constructeur) est indépendant du fuseau horaire:
Dans Central Standard Time:
À Anchorage, En Alaska:
À Paris, France:
Il est essentiel d'observer que, dans TOUS les cas, basée sur le fuseau horaire libre époque de décalage de zéro millisecondes, le temps est identique. 1 suis à Paris, la France est l'exact même moment que celle de 3 h le jour avant, à Anchorage, en Alaska, qui est l'exact même moment, à partir de 6 h à Chicago, Illinois.
Pour cette raison, l'on a accepté la réponse sur cette page est incorrect. Observer:
Si vous avez une chaîne de date dans un autre fuseau horaire, pas de conversion à l'objet créé par
new Date("date string")
est nécessaire. Pourquoi? JavaScript la valeur numérique de cette date sera la même, indépendamment de son fuseau horaire. JavaScript passe automatiquement à travers étonnamment à des procédures complexes pour extraire l'origine nombre de millisecondes écoulées depuis l'époque, quelle que soit l'origine de fuseau horaire a été.La ligne de fond est que de brancher une analyse de texte chaîne de date
x
dans lenew Date(x)
constructeur de convertir automatiquement le fuseau horaire d'origine, peu importe ce que pourrait être, dans le fuseau horaire libre époque millisecondes représentation du temps qui est le même quel que soit le fuseau horaire. Dans votre application, vous pouvez choisir de affichage la date dans le fuseau horaire que vous voulez, mais ne PAS ajouter/soustraire à la valeur numérique de la date pour le faire. La conversion est déjà passé à l'instant la date de l'objet a été créé. Le fuseau horaire n'est pas encore là, parce que la date objet est instancié à l'aide d'un précisément définie et fuseau horaire sans notion du temps.Le fuseau horaire ne commence à exister à nouveau lorsque l'utilisateur de votre application considérée. L'utilisateur dispose d'un fuseau horaire, de sorte que vous simplement affichage que le fuseau horaire de l'utilisateur. Mais cela arrive aussi automatiquement.
Considérons un couple de dates dans votre question initiale:
La console connaît déjà mon fuseau horaire, et donc il a automatiquement m'ont montré ce que ces moments pour moi.
Et si vous voulez connaître l'heure GMT/UTC représentation, aussi aucune conversion n'est nécessaire! Vous ne changez pas le temps. Il vous suffit d'affichage de l'heure UTC de la chaîne de l'époque:
De Code est écrit pour convertir fuseaux horaires numériquement en utilisant la valeur numérique d'un JavaScript date est presque voué à l'échec. Les fuseaux horaires sont trop compliqués, et c'est pourquoi le JavaScript a été conçu de sorte que vous n'avez pas besoin d'.
new Date("9/9/19")
il va utiliser le fuseau horaire du client. Donc, si vous voulez interpréter la date comme si elle avait été donnée en GMT, vous aurez besoin de supprimer le décalage horaire, comme indiqué dans la accepté de répondre.x = new Date('Fri Jan 20 2012 11:51:36 GMT-0500'); x.toUTCString()
et vous allez vous retrouver avec"Fri, 20 Jan 2012 16:51:36 GMT"
comme souhaité par le posteur d'origine. Aussi, même sans le fuseau horaire, fuseau horaire l'utilisateur est supposé (comme vous dites), mais la conversion est toujours effectué correctement partoUTCString()
.GMT-0500
. Il semble qu'il ne fonctionne pas lorsqu'il n'y a pas de fuseau horaire donné.+(new Date("9/9/19")) != +(new Date("9/9/19 GMT-000"))
x = new Date('9/20/2017');
Wed Sep 20 2017 00:00:00 GMT-0500 (CDT)x.toUTCString()
"Wed, 20 Sep 2017 05:00:00 GMT" Tout fonctionne parfaitement. Bottom line: un programmeur n'a pas "besoin" pour supprimer le décalage de fuseau horaire magique avec les mathématiques. Le système le fait pour vous. Vous devez vous pas tentative de le faire sur votre propre.Wed, 20 Sep 2017 05:00:00 GMT
. Si vous voulais9/20/2017
interprété comme si il ont été donnés dans le fuseau horaire GMT, le bon de sortie doit êtreWed, 20 Sep 2017 00:00:00 GMT
. Donc, vous devez supprimer le décalage horaire dans ce cas. Je ne dis pas que c'est ce que l'OP voulait; mon commentaire était juste un aparté pour toute personne ayant besoin pour ce faire. Je ne critique pas votre réponse, ou quoi que ce soit.Simplement utiliser
Date.getUTC*()
famille de méthodes. Sur mon ordinateur (CET UTC+01:00):Avis que
getUTCHours()
retourne heure en UTC.Voir aussi:
Je travaillais sur ce, j'ai peut-être un peu tard,
mais j'ai une solution de contournement.
Voici les étapes:
- Obtenir l'heure courante quel que soit le fuseau horaire de l'application de feu.-
- Obtenir le décalage de fuseau horaire de la zone de gmt 0. puis ajouter de la valeur dans votre fuseau horaire
milisecondes.
Vous obtiendrez la date dans votre fuseau horaire. J'ai ajouté un peu plus de code pour supprimer quoi que ce soit après le temps réel.
GMTDate = new Date().toGMTString();
Je suis en train d'essayer avec le ci-dessous. Cela semble fonctionner correctement. Existe-il des limites à cette approche? S'il vous plaît confirmer.
Basé sur la accepté de répondre et le deuxième plus haut score de répondre à la fois ne sont pas parfaits, selon le commentaire, donc j'ai mélangé les deux pour obtenir quelque chose de parfait:
JS: