Comment puis-je recueillir les informations sur le fuseau horaire du visiteur? J'ai besoin du fuseau horaire, ainsi que les heures offset GMT.
var offset = new Date().getTimezoneOffset();
console.log(offset);
Le décalage de fuseau horaire correspond à 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 situé derrière l’UTC et négatif s’il est avancé. Par exemple, si votre fuseau horaire est UTC + 10 (heure de l'Est australienne), -600 sera renvoyé. L'heure d'été empêche que cette valeur soit une constante même pour une locale donnée
Notez que tous les fuseaux horaires ne sont pas compensés par des heures entières: par exemple, Terre-Neuve correspond au temps UTC moins 3h 30m (en laissant l'heure d'été à l'écart de l'équation).
Je me rends compte que cette réponse est un peu hors sujet, mais j'imagine que nombre d'entre nous recherchant une réponse souhaitaient également formater le fuseau horaire pour l'affichage et obtenir peut-être aussi l'abréviation de zone. Alors ça y est ...
Si vous voulez que le fuseau horaire du client soit bien formaté, vous pouvez vous fier à la méthode JavaScript Date.toString et procédez comme suit:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
Cela vous donnera "GMT-0400 (EST)" par exemple, y compris les minutes du fuseau horaire, le cas échéant.
Alternativement, avec regex vous pouvez extraire n'importe quelle partie désiré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 juste "EDT":
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
Pour seulement "-0400":
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Date.toString référence: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
Il a déjà été expliqué comment obtenir un décalage en minutes en tant qu'entier, mais au cas où quelqu'un voudrait que le décalage GMT local soit 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))
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, car peu d’informations sont fournies par le navigateur.
Momentone Timentone utilise Date.getTimezoneOffset()
et Date.toString()
lors de quelques instants 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 correspondant à la ville la plus peuplée est renvoyé.
console.log(moment.tz.guess()); // America/Chicago
J'ai écrit une fonction dans mon projet, qui renvoie le fuseau horaire au format hh:mm
. J'espère que cela pourra 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
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);
}
// See output
document.write(getTimeZone());
essayez getTimezoneOffset()
de l'objet Date
:
var curdate = new Date()
var offset = curdate.getTimezoneOffset()
Cette méthode renvoie le décalage de fuseau horaire en minutes, qui correspond à la différence entre l'heure GMT et l'heure locale en minutes.
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
Avec moment.js :
moment().format('zz');
Si tout ce dont vous avez besoin est l’abréviation de fuseau horaire "MST" ou "EST":
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
Un one-line qui donne à la fois le décalage et le fuseau horaire consiste à simplement appeler toTimeString () sur un nouvel objet Date. De MDN:
La méthode
toTimeString()
renvoie la partie heure d'un objet Date sous une forme lisible par l'homme en anglais américain.
Le problème, c'est que le fuseau horaire n'est pas au format IANA standard; c'est un peu plus convivial que le format "continent/ville" IANA . Essaye le:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
En Californie, toTimeString()
renvoie Pacific Daylight Time
tandis que l'API Intl renvoie America/Los_Angeles
. En Colombie, vous obtiendrez 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 spécifique. L'appel de toString () renverra la date sous une forme lisible par l'homme en anglais américain. [...] Parfois, il est souhaitable d'obtenir une chaîne de la partie temporelle; une telle chose peut être accomplie avec la méthode
toTimeString()
.La méthode
toTimeString()
est particulièrement utile car les moteurs conformes implémentant ECMA-262 peuvent différer dans la chaîne obtenue à partir detoString()
pour les objetsDate
, car le format dépend de la mise en oeuvre. les approches simples de découpage en chaîne peuvent ne pas produire des résultats cohérents sur plusieurs moteurs.
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 normale de l'Inde)
O/P: +0530
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 un commentaire, vous devriez essayer comme ceci-
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));
}
Voir cet opérateur résultant était opposé au fuseau horaire .Pour appliquer une fonction mathématique puis valider le nombre inférieur ou supérieur.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
Cette valeur provient de la machine de l'utilisateur et peut être modifiée à tout moment. Je pense que cela n'a pas d'importance. Je souhaite simplement obtenir une valeur approximative, puis la convertir en GMT sur mon serveur.
Par exemple, je suis de Taiwan et il renvoie "+8" pour moi.
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
Au lieu de new Date().getTimezoneOffset()
et moment().format('zz')
, vous pouvez également utiliser momentjs :
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 maintenu ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )
Essaye ça,
new Date().toString().split("GMT")[1].split(" (")[0]
Je cherchais seulement la chaîne de 3 lettres (comme "PDT") et j'ai essayé de répondre à Marquez, mais je devais la modifier légèrement pour prendre en charge plusieurs navigateurs. Heureusement, la chaîne est la dernière correspondance potentielle :)
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
Utilisez ceci pour convertir OffSet en positif:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);