Comment initialiser un JavaScript Date à un fuseau horaire particulier
J'ai date heure dans un fuseau horaire comme une chaîne de caractères et je veux convertir ce de l'heure locale. Mais, je ne sais pas comment faire pour régler 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);
Autant que je sache, je peux définir l'heure UTC ou heure locale. Mais, comment puis-je régler l'heure dans un autre fuseau horaire?
J'ai essayé d'utiliser le ajouter ou soustraire le décalage entre l'UTC, mais je ne sais pas comment faire pour contrer l'avancée de l'épargne. Ne suis pas sûr si je suis vers la bonne direction.
Comment puis-je aller sur la conversion de l'heure d'un autre fuseau horaire à l'heure locale en javascript?
- Cette réponse peut vous aider
- Date d'objets n'ont pas d'horaire, ils sont en UTC.
Vous devez vous connecter pour publier un commentaire.
Arrière-plan
JavaScript
Date
objet pistes de temps en temps UTC en interne, mais en général, accepte l'entrée et la sortie de l'heure locale de l'ordinateur, il est en cours d'exécution sur. Il ne dispose pas d'installations pour le travail avec d'autres fuseaux horaires. Il peut analyser et des dates de sortie qui sont en UTC ou Local, mais il ne peut pas travailler directement avec d'autres fuseaux horaires.Être absolument précis, la représentation interne d'un
Date
objet est un numéro unique, représentant le nombre de millisecondes qui se sont écoulées depuis1970-01-01 00:00:00 UTC
, sans égard pour les secondes intercalaires. Il n'y a pas de temps horaire ou de format de chaîne de caractères stockée dans l'objet Date elle-même. Lorsque les diverses fonctions de laDate
objet sont utilisées, heure locale de l'ordinateur de la zone est appliquée à la représentation interne. Si la fonction crée une chaîne de caractères, puis de l'ordinateur les informations de paramètres régionaux peuvent être pris en considération pour déterminer la façon de produire cette chaîne. Les détails varient selon la fonction, et certains sont spécifiques à l'implémentation.Bibliothèques
Heureusement, il existe des bibliothèques qui peuvent être utilisés pour travailler avec les fuseaux horaires. Mais ils ne peuvent toujours pas faire la
Date
objet se comportent différemment, ils ont généralement l'application de la norme Olson/IANA fuseau horaire de base de données et fournir des fonctions pour l'utiliser en JavaScript. Certains ont une surcharge si vous exécutez dans un navigateur web, la base de données peut devenir un peu plus grand, si vous voulez l'ensemble de la chose. Heureusement, la plupart de ces bibliothèques vous permettent de choisir les zones que vous souhaitez à l'aide de la taille des données beaucoup plus agréable au goût. Aussi certains utilisent des fonctionnalités modernes pour obtenir des données de fuseau horaire à partir de laIntl
API au lieu d'avoir à expédier eux-mêmes.Il y a plusieurs bibliothèques pour cela que je suis conscient de:
WallTime-js(fin de série)Luxon est sans doute le pari le plus sûr pour tout l'usage moderne, et est le plus léger de poids, car il utilise la
Intl
API pour ses données de fuseau horaire.Moment-timezone est une extension pour moment.js, et apporte ses propres données de fuseau horaire.
js-joda est un code JavaScript de la mise en œuvre de la Joda-Time API (Java), et comprend à la fois la zone de support par l'intermédiaire d'un module séparé.
date-fns-tz est une extension pour date-pnr 2.x. date-fns-fuseau horaire est une extension pour date-pnr 1.x.
BigEasy/Fuseau horaire semble également être sur la bonne voie.
WallTime-js a atteint en fin de vie, et les propriétaires sont migration vers moment-timezone.
TimeZoneJS a été autour de la plus longue, mais est connu pour avoir certains de longue date de bugs, en particulier près de l'heure d'été transitions. Espérons que ces sera fixé à un certain moment dans l'avenir.
tz.js a également été autour depuis un certain temps, mais n'est pas très bien documenté, à mon humble avis.
Vous devez évaluer ces bibliothèques à voir qui répondra à vos besoins. En cas de doute, aller avec le moment/moment-timezone.
La prise en charge Native dans les Environnements Modernes
Si vous pouvez limiter votre utilisation d'environnements modernes, vous pouvez maintenant effectuer les opérations suivantes sans les bibliothèques:
Ce n'est pas une solution complète, mais il travaille pour de nombreux scénarios qui nécessitent uniquement de sortie de conversion (UTC ou heure locale à un moment précis de la zone, mais pas dans l'autre sens). Cela fait partie de l'ECMAScript l'Internationalisation de l'API (ECMA-402). Voir ce post pour plus de détails. Ce tableau de compatibilité pistes versions qui sont pris en charge. C'est le
Intl
API mentionné ci-dessus que certaines bibliothèques utilisent en interne maintenant.(Pour être clair, ce n'est pas initialiser un
Date
objet, mais peut être utilisé pour appliquer un fuseau horaire lors de la production d'une version particulière de la représentation.)Les Futures Propositions
La TC39 Temporelle Proposition vise à fournir un nouveau jeu d'objets standard pour travailler avec des dates et des heures dans le langage JavaScript lui-même. Ce sera un fuseau horaire courant de l'objet.
var date_time = new Date()
, la valeur dedate_time
est (pour moi en AEST)Date {Sun Aug 21 2016 22:18:47 GMT+1000 (AEST)}
et donc, par conséquent, il semble qu'il est stocké un fuseau horaire. Comment puis-je m'assurerdate_time
est purement l'heure UTC, sans n'importe quel fuseau horaire inclus?new Date().getTime();
private double date
est la seule occurrence de champ. Tout le reste est statique, et principalement pour la mise en cache de l'environnement a fourni des valeurs. Ce n'est pas quelque chose de suivi par exemple, ou quelque chose que vous pouvez modifier facilement.Date.UTC
fonction de calcul du timestamp basé sur l'heure UTC entrées est tout. La sortie de.toString()
sera l'heure locale équivalent, et montrera l'heure locale de la zone de décalage, le nom ou l'abréviation.Comme Matt Johnson a dit
Ainsi, bien que le navigateur ne peut pas lire l'IANA fuseaux horaires lors de la création d'une date, ou a des méthodes pour modifier les fuseaux horaires sur un objet Date, il semble y avoir un hack autour d'elle:
JS:
toLocaleString
pour atteindre l'effet inverse, et oui, ce devrait être commun de connaissances ! aller écrire un article à ce sujet et de me mentionner 🙂Vous pouvez spécifier un décalage de fuseau horaire sur
new Date()
, par exemple:ou
Depuis
Date
magasin de l'heure UTC ( c'est à diregetTime
retourne en UTC ), javascript, eux convertir l'heure en UTC, et lorsque vous appelez des choses commetoString
javascript va convertir l'heure UTC dans le navigateur du fuseau horaire local et le retour de la chaîne dans le fuseau horaire local, c'est à dire Si je suis en utilisantUTC+8
:Vous pouvez également utiliser la normale
getHours/Minute/Second
méthode:( Ce
8
signifie qu'après le temps est converti en mon heure locale -UTC+8
, le nombre d'heures est8
. )J'ai rencontré un problème similaire avec les tests unitaires (plus précisément dans la plaisanterie lorsque les tests unitaires exécuter localement afin de créer des snapshots et puis le serveur CI s'exécute dans (potentiellement) un autre fuseau horaire, provoquant la comparaison de clichés à l'échec). J'ai raillé notre
Date
et certaines de ces méthodes comme:J'ai trouvé le moyen de le faire, sans se soucier d'un tiers de la bibliothèque, a été en utilisant
getTimezoneOffset
qui permet de calculer le timestamp, ou de mettre à jour l'heure alors utiliser les méthodes normales pour obtenir la date et l'heure.MODIFIER
J'étais auparavant à l'aide de
UTC
méthodes lors de l'exécution de la date de transformations, ce qui était erroné. Avec l'ajout de l'offset dans le temps, en utilisant leget
fonctions retournent les résultats souhaités.timezone_offset
?timezone_offset
doit avoir étéoffset
, ou vice versa. J'ai édité ma réponse à montrer le bon nom de variable.Essayez d'utiliser ctoc de mnp.
https://www.npmjs.com/package/ctoc_timezone
Il a obtenu la simple fonctionnalité de changement de fuseaux horaires (la plupart des fuseaux horaires autour de 400) et tous les formats personnalisés u veux qu'il affiche.
Cela devrait résoudre votre problème, n'hésitez pas à proposer des correctifs. Cette méthode ne compte pour l'heure d'été pour la date donnée.
Comment utiliser avec le fuseau horaire et l'heure locale:
Je sais que ses 3 ans trop tard, mais peut-être que ça peut aider quelqu'un d'autre parce que je n'ai pas trouvé quoi que ce soit, sauf pour l'heure, le fuseau horaire de la bibliothèque, qui n'est pas exactement le même que ce qu'il demande pour ici.
J'ai fait quelque chose de similaire pour l'allemand fuseau horaire,
c'est un peu complexe à cause de l'heure d'été et les années bissextiles où vous avez 366 jours.
il pourrait avoir besoin d'un peu de travail avec la "isDaylightSavingTimeInGermany de la fonction" alors que les différences de fuseaux horaires du changement sur les différents temps de l'heure d'été.
de toute façon, consultez cette page:
https://github.com/zerkotin/german-timezone-converter/wiki
les principales méthodes sont:
convertLocalDateToGermanTimezone
convertGermanDateToLocalTimezone
J'ai mis un effort en le documentant, afin de ne pas être si confus.
Essayer: date-de-timezone, il résout la date prévue avec l'aide de disponibles nativement
Intl.DateTimeFormat
.J'ai utilisé cette méthode dans un de mes projets depuis quelques années déjà, mais maintenant j'ai décidé de le publier en tant que petit projet OS 🙂
Appuyant sur les réponses ci-dessus, je suis en utilisant ce natif d'un liner pour convertir le long de la chaîne timezone pour les trois lettres de la chaîne:
Cela donnera PDT ou de la TVP en fonction à la date prévue. Dans mon cas d'utilisation particulier, le développement sur Salesforce (Aura/Foudre), nous sommes en mesure d'obtenir le fuseau horaire de l'utilisateur dans le format long depuis le backend.
Pour Ionique utilisateurs, j'ai eu l'enfer avec ce parce que
.toISOString()
doit être utilisé avec le modèle html.Cela va saisir la date du jour, mais bien sûr, peut être ajouté à des questions précédentes pour une date sélectionnée.
Je l'ai fixé à l'aide de ceci:
JS:
L' *60000 indique l'UTC -6 qui est de la CST, donc quel que soit le Fuseau horaire est nécessaire, le nombre et la différence peut être changé.
A été confronté au même problème, a utilisé ce un
De la Console.log(Date.parse("13 Juin 2018 10:50:39 GMT+1"));
Il sera de retour millisecondes pour lesquelles vous pouvez vérifier l'ont +de 100 timzone initialiser Britanniques le temps
Espérons que cela aide!!