Comment puis-je recueillir les informations de fuseau horaire du visiteur? J'ai besoin du fuseau horaire, ainsi que des heures de décalage GMT.
Comment puis-je recueillir les informations de fuseau horaire du visiteur? J'ai besoin du fuseau horaire, ainsi que des heures de décalage GMT.
Réponses:
var offset = new Date().getTimezoneOffset();
console.log(offset);
Le décalage de fuseau horaire est la différence, en minutes, entre l'heure UTC et l'heure locale. Notez que cela signifie que le décalage est positif si le fuseau horaire local est derrière UTC et négatif s'il est devant. Par exemple, si votre fuseau horaire est UTC + 10 (Australian Eastern Standard Time), -600 sera renvoyé. L'heure d'été empêche cette valeur d'être constante même pour un lieu donné
Notez que tous les fuseaux horaires ne sont pas décalés par des heures entières: par exemple, Terre-Neuve est UTC moins 3 h 30 (ce qui laisse l'heure d'été hors de l'équation).
getTimezoneOffset
inexactitude est-elle en vigueur? L'article auquel vous faites référence est daté de juin 2007 et ne contient aucun détail sur l'inexactitude de la fonction. Et en fait, la bibliothèque que jsTimezoneDetect
vous avez pointée utilise getTimezoneOffset
elle-même.
var hrs = -(new Date().getTimezoneOffset() / 60)
pour compenser les heures généralement utilisées
timezone
! =utc offset
L'utilisation d'un décalage pour calculer le fuseau horaire est une mauvaise approche et vous rencontrerez toujours des problèmes. Les fuseaux horaires et les règles d'heure d'été peuvent changer à plusieurs reprises au cours d'une année, et il est difficile de suivre les changements.
Pour obtenir le fuseau horaire IANA du système en JavaScript, vous devez utiliser
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
ecma-402 / 1.0 indique que cela timeZone
peut être indéfini s'il n'est pas fourni au constructeur. Cependant, le futur brouillon (3.0) a résolu ce problème en passant au fuseau horaire par défaut du système.
Dans cette version de l'API d'internationalisation ECMAScript, la
timeZone
propriété restera indéfinie si aucunetimeZone
propriété été fournie dans l'objet options fourni auIntl.DateTimeFormat
constructeur . Cependant, les applications ne doivent pas se fier à cela, car les futures versions pourraient renvoyer une valeur String identifiant le fuseau horaire actuel de l'environnement hôte.
dans ecma-402 / 3.0 qui est encore dans un projet, il est devenu
Dans cette version de l'API d'internationalisation ECMAScript 2015, la
timeZone
propriété sera le nom du fuseau horaire par défaut si aucunetimeZone
propriété n'a été fournie dans l'objet options fourni auIntl.DateTimeFormat
constructeur. La version précédente laissait latimeZone
propriété non définie dans ce cas.
Je me rends compte que cette réponse est un peu hors sujet, mais j'imagine que beaucoup d'entre nous à la recherche d'une réponse voulaient également formater le fuseau horaire pour l'affichage et peut-être aussi l'abréviation de la zone. Alors c'est parti ...
Si vous voulez que le fuseau horaire du client soit bien formaté, vous pouvez vous fier à la méthode JavaScript Date.toString et faire:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
Cela vous donnera par exemple «GMT-0400 (EST)», y compris les minutes du fuseau horaire, le cas échéant.
Alternativement, avec regex, vous pouvez extraire n'importe quelle partie souhaitée:
Pour "GMT-0400 (EDT)":
new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]
Pour "GMT-0400":
new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]
Pour "EDT":
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
Pour "-0400" seulement:
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Référence Date.toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
split[4] + " " + split[5]
?!
split
contient: ["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
donc le résultat estDaylight Time)
new Date().toString()
dépend complètement de vos paramètres régionaux. Attendre des sorties des autres clients qu'elles ressemblent aux vôtres est une très mauvaise idée.
On a déjà répondu comment obtenir l'offset en minutes sous forme d'entier, mais au cas où quelqu'un voudrait l'offset GMT local sous forme de chaîne, par exemple "+1130"
:
function pad(number, length){
var str = "" + number
while (str.length < length) {
str = '0'+str
}
return str
}
var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
pad(parseInt(Math.abs(offset/60)), 2)+
pad(Math.abs(offset%60), 2))
pad(parseInt(Math.abs(offset/60)), 2)
pour le faire correctement ... sinon vous pourriez finir par obtenir +5.530 comme dans mon cas ... je ne sais pas si le plancher de mathématiques, etc. sera une meilleure chose ici ou non .... mais cela au moins me donne +0530 comme prévu
Vous pouvez utiliser:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
La détection du fuseau horaire du navigateur est plutôt délicate à effectuer, car il y a peu d'informations fournies par le navigateur.
Moment Timezone utilise Date.getTimezoneOffset()
et Date.toString()
sur une poignée de moments de l'année en cours pour collecter autant d'informations que possible sur l'environnement du navigateur. Il compare ensuite ces informations avec toutes les données de fuseau horaire chargées et renvoie la correspondance la plus proche. En cas d'égalité, le fuseau horaire avec la ville la plus peuplée est retourné.
console.log(moment.tz.guess()); // America/Chicago
J'ai écrit une fonction dans mon projet, qui renvoie le fuseau horaire au hh:mm
format. J'espère que cela peut aider quelqu'un:
function getTimeZone() {
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}
// Outputs: +5:00
Une ligne unique qui donne à la fois le décalage et le fuseau horaire consiste à simplement appeler toTimeString () sur un nouvel objet Date. De MDN:
La
toTimeString()
méthode renvoie la partie heure d'un objet Date sous une forme lisible par l'homme en anglais américain.
Le hic, c'est que le fuseau horaire n'est pas au format IANA standard; il est un peu plus convivial que le format IANA "continent / ville" . Essaye le:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
En Californie en ce moment, toTimeString()
revient Pacific Daylight Time
tandis que l'API Intl revient America/Los_Angeles
. En Colombie, vous auriez Colombia Standard Time
, contre America/Bogota
.
Notez que de nombreuses autres réponses à cette question tentent d'obtenir les mêmes informations en appelant Date.toString (). Cette approche n'est pas aussi fiable que explique MDN :
Les instances de date font référence à un moment précis. L'appel à toString () renverra la date formatée sous une forme lisible par l'homme en anglais américain. [...] Parfois, il est souhaitable d'obtenir une chaîne de temps; une telle chose peut être accomplie avec la
toTimeString()
méthode.La
toTimeString()
méthode est particulièrement utile car les moteurs conformes implémentant ECMA-262 peuvent différer dans la chaîne obtenue à partirtoString()
desDate
objets, car le format dépend de l'implémentation; les approches de découpage de chaîne simples peuvent ne pas produire des résultats cohérents sur plusieurs moteurs.
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
Avec moment.js :
moment().format('zz');
Z
etZZ
Avec momentjs, vous pouvez trouver le fuseau horaire actuel
console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
Avec dayjs, vous pouvez trouver le fuseau horaire actuel
console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>
Les deux API renvoient le décalage utc en quelques minutes.
getTimezoneOffset()
.
Fuseau horaire en heures-
var offset = new Date().getTimezoneOffset();
if(offset<0)
console.log( "Your timezone is- GMT+" + (offset/-60));
else
console.log( "Your timezone is- GMT-" + offset/60);
Si vous voulez être précis comme vous l'avez mentionné dans le commentaire, alors vous devriez essayer comme ça-
var offset = new Date().getTimezoneOffset();
if(offset<0)
{
var extraZero = "";
if(-offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
var extraZero = "";
if(offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}
Si vous n'avez besoin que de l'abréviation du fuseau horaire "MST" ou "EST":
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
Date.toString()
n'est pas fiable et MDN explique pourquoi. J'ai collé la section pertinente de leurs documents dans ma réponse .
Voir cet opérateur résultant était opposé au fuseau horaire. Donc, appliquez une fonction mathématique puis validez le nombre moins ou plus.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
round
? Ça devrait l'être floor
, non?
function getLocalTimeZone() {
var dd = new Date();
var ddStr = dd.toString();
var ddArr = ddStr.split(' ');
var tmznSTr = ddArr[5];
tmznSTr = tmznSTr.substring(3, tmznSTr.length);
return tmznSTr;
}
Exemple: jeu 21 juin 2018 18:12:50 GMT + 0530 (heure standard de l'Inde)
O / P: +0530
Date.toString()
n'est pas fiable et MDN explique pourquoi. J'ai collé la section pertinente de leurs documents dans ma réponse .
Essaye ça,
new Date().toString().split("GMT")[1].split(" (")[0]
Cette valeur provient de la machine de l'utilisateur et peut être modifiée à tout moment, donc je pense que cela n'a pas d'importance, je veux juste obtenir une valeur approximative puis la convertir en GMT sur mon serveur.
Par exemple, je viens de Taïwan et cela me renvoie "+8".
JS
function timezone() {
var offset = new Date().getTimezoneOffset();
var minutes = Math.abs(offset);
var hours = Math.floor(minutes / 60);
var prefix = offset < 0 ? "+" : "-";
return prefix+hours;
}
$('#result').html(timezone());
HTML
<div id="result"></div>
Résultat
+8
Sur le new Date(
), vous pouvez obtenir le décalage, pour obtenir le nom du fuseau horaire, vous pouvez faire:
new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
vous obtenez la valeur entre ()
à la fin de la date, c'est le nom du fuseau horaire.
Date.toString()
n'est pas fiable et MDN explique pourquoi. J'ai collé la section pertinente de leurs documents dans ma réponse . De plus, cette réponse a déjà été donnée au moins 3 fois.
Ce serait ma solution:
// For time zone:
const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
// Offset hours:
const offsetHours = new Date().getTimezoneOffset() / 60;
console.log(`${timeZone}, ${offsetHours}hrs`);
Comme alternative à new Date().getTimezoneOffset()
etmoment().format('zz')
, vous pouvez également utilisermomentjs:
var offset = moment.parseZone(Date.now()).utcOffset() / 60
console.log(offset);
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
jstimezone est également assez bogué et non entretenu ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )
Utilisez ceci pour convertir OffSet en postive:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
Je cherchais juste la chaîne de 3 lettres (comme "PDT") et j'ai essayé la réponse de Marquez mais j'ai dû l'ajuster un peu pour la prise en charge de plusieurs navigateurs. Heureusement, la chaîne est le dernier match potentiel :)
Voici ce que j'ai fait, dans CoffeeScript:
browserTimezone = ->
userDate = new Date()
zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
userZone = zoneMatches[zoneMatches.length - 1]
Fonctionne dans IE8, IE9, Safari 9, Firefox 44 et Chrome 48
Date.toString()
n'est pas fiable et MDN explique pourquoi. J'ai collé la section pertinente de leurs documents dans ma réponse .
Il vous suffit d'inclure moment.js et jstz.js
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>
et après ça
<script>
$(function(){
var currentTimezone = jstz.determine();
var timezone = currentTimezone.name();
alert(timezone);
});
</script>
vous pouvez simplement essayer ceci. il vous renverra l'heure actuelle de la machine
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())
new Date(new Date().getTime());
cela afficherait: "Ven 28 déc 2018 10:15:23 GMT + 0100 (heure normale d'Europe centrale) {}"