Existe-t-il un moyen fiable d'obtenir un fuseau horaire à partir du navigateur client? J'ai vu les liens suivants mais je veux une solution plus robuste.
javascript
http
browser
timezone
confucius
la source
la source
Réponses:
Regardez ce pageloom de référentiel, il est utile
téléchargez jstz.min.js et ajoutez une fonction à votre page html
et appelez cette fonction depuis votre tag d'affichage
la source
Intl.DateTimeFormat().resolvedOptions().timeZone
(pas d'IE11) comme suggéré par Wallace.Une demi-décennie plus tard, nous avons un moyen intégré pour cela! Pour les navigateurs modernes, j'utiliserais:
Cela renvoie une chaîne de fuseau horaire IANA, mais pas le décalage . En savoir plus sur la référence MDN .
Tableau de compatibilité - en mars 2019, fonctionne pour 90% des navigateurs utilisés dans le monde. Ne fonctionne pas sur Internet Explorer .
la source
Intl.DateTimeFormat().resolvedOptions().timeZone
->undefined
Intl.DateTimeFormat().resolvedOptions().timeZone
renverra la valeur attendue à partir de Firefox 52: kangax.github.io/compat-table/esintl/…Souvent, lorsque les gens recherchent des «fuseaux horaires», ce qui suffit, c'est simplement le «décalage UTC». par exemple, leur serveur est en UTC + 5 et ils veulent savoir que leur client fonctionne en UTC-8 .
En clair, l'ancien javascript
(new Date()).getTimezoneOffset()/60
retournera le nombre actuel d'heures de décalage par rapport à UTC.Il convient de noter un possible "gotcha" dans le signe de la
getTimezoneOffset()
valeur de retour (à partir de la documentation MDN) :Cependant, je vous recommande d'utiliser le day.js pour le code Javascript lié à l'heure / la date. Dans ce cas, vous pouvez obtenir un décalage UTC au format ISO 8601 en exécutant:
Il convient probablement de mentionner que le client peut facilement falsifier ces informations.
(Remarque: cette réponse recommandait à l'origine https://momentjs.com/ , mais dayjs est une alternative plus moderne et plus petite.)
la source
Pour l'instant, le meilleur pari est probablement jstz comme suggéré dans la réponse de mbayloon .
Par souci d'exhaustivité, il convient de mentionner qu'il existe une norme sur son chemin: Intl . Vous pouvez déjà voir cela dans Chrome:
(Cela ne suit pas réellement la norme, ce qui est une raison de plus de s'en tenir à la bibliothèque)
la source
Intl
sont censées renvoyerundefined
pour latimeZone
propriété si vous n'avez pas spécifié manuellement de fuseau horaire lors de la construction du fichierDateTimeFormat
. Chrome s'écarte de la norme en renvoyant le fuseau horaire du système à la place; c'est ce que la réponse de Johannes exploite, mais aussi pourquoi il a dit "ne suit pas réellement la norme".vous pouvez utiliser le fuseau horaire du moment pour deviner le fuseau horaire:
la source
Voici un jsfiddle
Il fournit l'abréviation du fuseau horaire de l'utilisateur actuel.
Voici l'exemple de code
la source
May 22 2015 03:45 PM CDT
je l'ai utiliséeconsole.log(moment(now).format('MMM DD YYYY hh:mm A') + ' ' + moment.tz.zone(tz.name()).abbr(now.getTime()));
J'ai utilisé une approche similaire à celle adoptée par Josh Fraser , qui détermine le décalage horaire du navigateur par rapport à UTC et s'il reconnaît ou non l'heure d'été (mais quelque peu simplifiée à partir de son code):
Lors du chargement, la
ClientTZ.getBrowserTZ()
fonction est exécutée, ce qui définit:ClientTZ.UTCoffset
au décalage horaire du navigateur par rapport à UTC en minutes (par exemple, CST est de -360 minutes, qui est de -6,0 heures de UTC);ClientTZ.UTCoffsetT
au décalage sous la forme'±hhmmD'
(par exemple,'-0600D'
), où le suffixe estD
pour DST etS
pour standard (non-DST);ClientTZ.hasDST
(à vrai ou faux).Le
ClientTZ.UTCoffset
est fourni en minutes au lieu d'heures, car certains fuseaux horaires ont des décalages horaires fractionnaires (par exemple, +0415).L'intention derrière
ClientTZ.UTCoffsetT
est de l'utiliser comme clé dans un tableau de fuseaux horaires (non fourni ici), comme pour une<select>
liste déroulante .la source
7-1
pour juillet au lieu de juin. Je ne sais pas si cela fait vraiment une différence, car je doute qu'il existe des régimes régionaux d'heure d'été qui n'incluent pas le mois de juin.Non. Il n'y a pas de moyen fiable unique et il n'y en aura jamais. Pensiez-vous vraiment pouvoir faire confiance au client?
la source