web-dev-qa-db-fra.com

Obtenir le décalage du fuseau horaire du client en JavaScript

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).

458
NickFitz

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

114
Marquez

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))
70
cryo

Vous pouvez utiliser:

moment-fuseau horaire

<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
55
Sameer Ek

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());

Travailler Fiddle

35
Mr_Green

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.

12
dfa

JavaScript:

var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);

9
زياد

Avec moment.js :

moment().format('zz');
6
kolypto

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;
}
3
JohnP2

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 de toString() pour les objets Date, 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.

3
Dan Dascalescu
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

3
Chandrakanth Gowda

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));
}

3
Abrar Jahin

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.

 enter image description here

Voir le document MDN

var a = new Date().getTimezoneOffset();

var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;

console.log(res)

2
prasanth

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.

Exemple de travail

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
2
Terry Lin

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 )

1
brauliobo

Essaye ça,

new Date().toString().split("GMT")[1].split(" (")[0]
1
Srinivasan Sekar

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

0
ari gold

Utilisez ceci pour convertir OffSet en positif:

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
0
Kumal Pereira