J'ai la date et l'heure dans un fuseau horaire particulier sous forme de chaîne et je souhaite la convertir en heure locale. Mais, je ne sais pas comment définir le fuseau horaire dans l'objet Date.
Par exemple, j'ai Feb 28 2013 7:00 PM ET,
alors je peux
var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);
Pour autant que je sache, je peux régler l'heure UTC ou l'heure locale. Mais comment régler l'heure dans un autre fuseau horaire?
J'ai essayé d'utiliser l'ajout / soustraction du décalage de l'UTC mais je ne sais pas comment contrer l'heure d'été. Je ne sais pas si je vais dans la bonne direction.
Comment puis-je convertir du temps d'un fuseau horaire différent en heure locale en javascript?
javascript
timezone
pavanred
la source
la source
Réponses:
Contexte
L'
Date
objet JavaScript suit le temps en UTC en interne, mais accepte généralement les entrées et produit des sorties à l'heure locale de l'ordinateur sur lequel il s'exécute. Il a très peu d'installations pour travailler avec le temps dans d'autres fuseaux horaires.La représentation interne d'un
Date
objet est un nombre unique, représentant le nombre de millisecondes qui se sont écoulées depuis1970-01-01 00:00:00 UTC
, sans tenir compte des secondes intercalaires. Aucun fuseau horaire ni format de chaîne n'est stocké dans l'objet Date lui-même. Lorsque diverses fonctions de l'Date
objet sont utilisées, le fuseau horaire local de l'ordinateur est appliqué à la représentation interne. Si la fonction produit une chaîne, les informations locales de l'ordinateur peuvent être prises en considération pour déterminer comment produire cette chaîne. Les détails varient selon la fonction et certains sont spécifiques à l'implémentation.Les seules opérations que l'
Date
objet peut effectuer avec des fuseaux horaires non locaux sont:Il peut analyser une chaîne contenant un décalage UTC numérique à partir de n'importe quel fuseau horaire. Il l'utilise pour ajuster la valeur analysée et stocke l'équivalent UTC. L'heure locale et le décalage d'origine ne sont pas conservés dans l'
Date
objet résultant . Par exemple:Dans les environnements qui ont implémenté l' API d'internationalisation ECMASCript (alias "Intl"), un
Date
objet peut produire une chaîne spécifique aux paramètres régionaux ajustée à un identifiant de fuseau horaire donné. Ceci est accompli via l'timeZone
option totoLocaleString
et ses variations. La plupart des implémentations prendront en charge les identifiants de fuseau horaire IANA, tels que'America/New_York'
. Par exemple:La plupart des environnements modernes prennent en charge l'ensemble complet des identificateurs de fuseau horaire IANA ( voir le tableau de compatibilité ici ). Cependant, gardez à l'esprit que le seul identifiant requis pour être pris en charge par Intl est
'UTC'
, vous devez donc vérifier attentivement si vous devez prendre en charge les navigateurs plus anciens ou les environnements atypiques (par exemple, les appareils IoT légers).Bibliothèques
Il existe plusieurs bibliothèques qui peuvent être utilisées pour travailler avec des fuseaux horaires. Bien qu'ils ne puissent toujours pas faire en sorte que l'
Date
objet se comporte différemment, ils implémentent généralement la base de données de fuseau horaire IANA standard et fournissent des fonctions pour l'utiliser en JavaScript. Les bibliothèques modernes utilisent les données de fuseau horaire fournies par l'API Intl, mais les bibliothèques plus anciennes ont généralement des frais généraux, surtout si vous utilisez un navigateur Web, car la base de données peut devenir un peu volumineuse. Certaines de ces bibliothèques vous permettent également de réduire de manière sélective l'ensemble de données, selon les fuseaux horaires pris en charge et / ou la plage de dates avec lesquelles vous pouvez travailler.Voici les bibliothèques à considérer:
Bibliothèques basées sur Internet
Les nouveaux développements doivent choisir l'une de ces implémentations, qui s'appuient sur l'API Intl pour leurs données de fuseau horaire:
Bibliothèques non internationales
Ces bibliothèques sont maintenues, mais portent le fardeau de regrouper leurs propres données de fuseau horaire, qui peuvent être assez volumineuses.
* Alors que Moment et Moment-Timezone étaient précédemment recommandés, l'équipe Moment préfère désormais que les utilisateurs choisissent Luxon pour un nouveau développement.
Bibliothèques abandonnées
Ces bibliothèques ont été officiellement fermées et ne devraient plus être utilisées.
Propositions futures
La proposition temporelle TC39 vise à fournir un nouvel ensemble d'objets standard pour travailler avec les dates et les heures dans le langage JavaScript lui-même. Cela inclura la prise en charge d'un objet sensible au fuseau horaire.
la source
var date_time = new Date()
la valeur dedate_time
est (pour moi dans AEST)Date {Sun Aug 21 2016 22:18:47 GMT+1000 (AEST)}
et donc il semble qu'il ait stocké un fuseau horaire. Comment puis-je m'assurer qu'ildate_time
s'agit uniquement de l'heure UTC, sans fuseau horaire inclus?new Date().getTime();
Comme l'a dit Matt Johnson
Ainsi, bien que le navigateur ne puisse pas lire les fuseaux horaires IANA lors de la création d'une date, ou dispose de méthodes pour modifier les fuseaux horaires sur un objet Date existant, il semble y avoir un hack autour de lui:
la source
toLocaleString
pour obtenir l'effet inverse, et oui, cela devrait être de notoriété publique! allez écrire un article à ce sujet et mentionnez-moi :-)Date
objet qu'il retourne est un mensonge. Même dans l'exemple illustré, la sortie de chaîne inclut le fuseau horaire de la machine locale. Sur mon ordinateur, les deux résultats indiquent «GMT-0700 (heure avancée du Pacifique)», où cela n'est correct que pour le premier (Toronto est en fait en heure de l'Est). Au-delà de la sortie de chaîne, l'horodatage contenu dans l'Date
objet a été décalé à un autre moment dans le temps. Cela peut être une technique utile, mais comporte de nombreuses mises en garde - principalement que lesDate
fonctions d'objet n'auront pas de sortie normale.Vous pouvez spécifier un décalage de fuseau horaire sur
new Date()
, par exemple:ou
Depuis le
Date
stockage de l'heure UTC (c'est-à-diregetTime
retourne en UTC), javascript convertira l'heure en UTC, et lorsque vous appelez des choses commetoString
javascript convertira l'heure UTC en fuseau horaire local du navigateur et renverra la chaîne dans le fuseau horaire local, c'est-à-dire si j'utiliseUTC+8
:Vous pouvez également utiliser la
getHours/Minute/Second
méthode normale :(Cela
8
signifie qu'une fois l'heure convertie en heure localeUTC+8
, le nombre d'heures est8
.)la source
Cela devrait résoudre votre problème, n'hésitez pas à proposer des correctifs. Cette méthode tiendra également compte de l'heure d'été pour la date indiquée.
Comment utiliser avec le fuseau horaire et l'heure locale:
la source
tzDate
directement?J'ai trouvé que la façon la plus prise en charge pour ce faire, sans se soucier d'une bibliothèque tierce, était
getTimezoneOffset
de calculer l'horodatage approprié ou de mettre à jour l'heure, puis d'utiliser les méthodes normales pour obtenir la date et l'heure nécessaires.ÉDITER
J'utilisais auparavant des
UTC
méthodes lors de l'exécution des transformations de date, ce qui était incorrect. En ajoutant le décalage à l'heure, l'utilisation desget
fonctions locales retournera les résultats souhaités.la source
timezone_offset
?timezone_offset
aurait dû êtreoffset
, ou vice versa. J'ai modifié ma réponse pour afficher le nom de variable correct.J'ai rencontré un problème similaire avec les tests unitaires (en particulier pour plaisanter lorsque les tests unitaires s'exécutent localement pour créer les instantanés, puis le serveur CI s'exécute (potentiellement) dans un fuseau horaire différent, ce qui entraîne l'échec de la comparaison des instantanés). J'ai moqué notre
Date
et certaines des méthodes de soutien comme ceci:la source
Essayez d'utiliser ctoc à partir de npm. https://www.npmjs.com/package/ctoc_timezone
Il a des fonctionnalités simples pour changer les fuseaux horaires (la plupart des fuseaux horaires environ 400) et tous les formats personnalisés que vous souhaitez afficher.
la source
En m'appuyant sur les réponses ci-dessus, j'utilise cette doublure native pour convertir la longue chaîne de fuseau horaire en une chaîne de trois lettres:
Cela donnera PDT ou PST selon la date fournie. Dans mon cas d'utilisation particulier, développé sur Salesforce (Aura / Lightning), nous sommes en mesure d'obtenir le fuseau horaire de l'utilisateur au format long à partir du backend.
la source
Je sais que c'est 3 ans trop tard, mais peut-être que cela peut aider quelqu'un d'autre parce que je n'ai rien trouvé de tel sauf la bibliothèque moment-fuseau horaire, qui n'est pas exactement la même que celle qu'il demande ici.
J'ai fait quelque chose de similaire pour le fuseau horaire allemand, c'est un peu complexe en raison de l'heure d'été et des années bissextiles où vous avez 366 jours.
cela peut nécessiter un peu de travail avec la fonction "isDaylightSavingTimeInGermany" tandis que différents fuseaux horaires changent à différentes heures, l'heure d'été.
de toute façon, consultez cette page: https://github.com/zerkotin/german-timezone-converter/wiki
les principales méthodes sont les suivantes: convertLocalDateToGermanTimezone convertGermanDateToLocalTimezone
J'ai fait un effort pour le documenter, donc ce ne sera pas si déroutant.
la source
Essayez: date-from-timezone , il résout la date prévue à l'aide de nativement disponible
Intl.DateTimeFormat
.J'ai utilisé cette méthode dans l'un de mes projets depuis quelques années déjà, mais c'est maintenant que j'ai décidé de la publier en tant que petit projet OS :)
la source
Peut-être que cela vous aidera
la source
Pour les utilisateurs Ionic, j'ai eu un enfer avec cela car il
.toISOString()
doit être utilisé avec le modèle html.Cela saisira la date actuelle, mais peut bien sûr être ajouté aux réponses précédentes pour une date sélectionnée.
Je l'ai réparé en utilisant ceci:
Le * 60000 indique l'UTC -6 qui est CST donc quel que soit TimeZone nécessaire, le nombre et la différence peuvent être modifiés.
la source
Était confronté au même problème, utilisé celui-ci
Console.log (Date.parse ("13 juin 2018 10:50:39 GMT + 1"));
Il retournera des millisecondes auxquelles vous pouvez vérifier que +100 fuseau horaire initialise l'heure britannique.
la source