Obtenir le fuseau horaire du client en JavaScript

Comment puis-je recueillir l'information sur le fuseau horaire des visiteurs? J'ai besoin du fuseau horaire, ainsi que des heures de décalage GMT.

426
demandé sur BadPirate 2009-07-07 13:48:16

23 réponses

var offset = new Date().getTimezoneOffset();
console.log(offset);

le décalage du fuseau horaire est la différence, en minutes, entre L'heure TUC et l'heure locale. Notez que cela signifie que le décalage est positif si le fuseau horaire local est en retard sur UTC et négatif s'il est en avance. Par exemple, si votre fuseau horaire est UTC+10 (Heure Normale de L'est de L'Australie), -600 vous sera retourné. L'heure avancée empêche cette valeur d'être constante même pour un lieu donné

notez que toutes les fuseaux horaires ne sont pas compensées par des heures entières: par exemple, Terre-Neuve est UTC moins 3h 30m (laissant L'heure D'été hors de l'équation).

428
répondu NickFitz 2016-06-30 16:13:57

utiliser un décalage pour calculer le fuseau horaire est une mauvaise approche, et vous rencontrerez toujours des problèmes. Les fuseaux horaires et l'heure d'été règles peuvent changer à plusieurs reprises au cours d'une année, et Il est difficile de suivre les changements.

pour obtenir un fuseau horaire correct en JavaScript, vous devez utiliser

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

malheureusement, au moment d'écrire ceci, il n'est pas encore largement soutenu.

Je sais que ça fonctionne correctement au moins dans Chrome.

ecma-402/1.0 indique que timeZone peut ne pas être défini si non fourni au constructeur. Toutefois, le futur projet (3.0) A CORRIGÉ ce problème en changeant le fuseau horaire par défaut du système.

dans cette version de L'API D'internationalisation D'ECMAScript, le timeZone propriété restera non défini si aucune timeZone propriété a été fourni dans les options objet fourni au Intl.DateTimeFormat constructeur . Toutefois, les applications ne devraient pas s'appuyer sur ce principe, car les les versions peuvent retourner une valeur de chaîne de caractères identifiant l'environnement de l'hôte fuseau horaire actuel à la place.

ecma-402/3.0 qui est encore dans un projet de il a changé

dans cette version de L'API D'internationalisation ECMAScript 2015, le timeZone propriété sera le nom du moment par défaut zone si non timeZone bien fourni dans l'article d'options fourni au Intl.DateTimeFormat constructeur. La version précédente de la gauche, le timeZone propriété non définie dans ce cas.

si avant de l'utiliser Vérifier le soutien actuel à travers les navigateurs par exemple à:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions

217
répondu Pawel Dubiel 2017-05-29 19:37:20

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 a également voulu formater le fuseau horaire pour l'affichage et peut-être obtenir l'abréviation de zone aussi. Donc, ici, il va...

si vous voulez que le fuseau horaire du client soit bien formaté, vous pouvez compter sur la Date JavaScript.méthode toString et à faire:

var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];

Cela vous donnera "GMT-0400 (heure de l'est)", par exemple, y compris le fuseau horaire de minutes, 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 "HAE" :

new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]

Pour "-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

109
répondu Marquez 2014-07-13 11:48:10

il a déjà été répondu comment obtenir le décalage en minutes comme un entier, mais dans le cas où quelqu'un veut le décalage GMT local comme une chaîne de caractères 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))
66
répondu cryo 2012-07-01 05:05:50

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 assez délicate à corriger, car il y a peu d'information fournie par le navigateur.

Moment Timezone utilise Date.getTimezoneOffset() et Date.toString() sur une poignée de moments autour de l'année en cours pour recueillir autant d'informations sur l'environnement du navigateur que possible. Il compare ensuite ces informations avec toutes les données de fuseau horaire chargé et renvoie la correspondance la plus proche. En cas de liens, le fuseau horaire avec la ville la plus peuplée est retourné.

console.log(moment.tz.guess()); // America/Chicago
51
répondu Sameer Ek 2017-05-29 20:02:11

j'ai écrit une fonction dans mon projet, qui renvoie le fuseau horaire au format hh:mm . 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

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

Violon De Travail

31
répondu Mr_Green 2015-12-07 07:44:49

essayer getTimezoneOffset() de la Date objet:

var curdate = new Date()
var offset = curdate.getTimezoneOffset()

cette méthode renvoie le décalage du fuseau horaire en minutes, qui est la différence entre L'heure GMT et l'heure locale en minutes.

12
répondu dfa 2013-06-09 06:26:46

JavaScript:

var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
8
répondu زياد 2016-11-30 01:16:04

avec moment.js :

moment().format('zz');
6
répondu kolypto 2014-07-11 10:30:53

avec , vous pouvez trouver le fuseau horaire actuel comme

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>

il renvoie UTC offset en minutes.

Plus D'Informations

3
répondu Fizer Khan 2016-06-30 17:53:08

si vous n'avez besoin que du" MST "ou de l'abréviation du fuseau horaire" EST":

function getTimeZone(){
    var now = new Date().toString();
    var timeZone = now.replace(/.*[(](.*)[)].*/,'');//extracts the content between parenthesis
    return timeZone;
}
3
répondu JohnP2 2017-01-11 01:04:25

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, 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));
}
3
répondu Abrar Jahin 2017-03-27 19:10:30
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 Jun 21 2018 18: 12: 50 GMT+0530 (India Standard Time)

O / P: +0530

3
répondu Chandrakanth Gowda 2018-06-21 12:51:30

cette valeur est de la machine de l'utilisateur et il peut être changé à tout moment donc je pense qu'il n'a pas d'importance, je veux juste obtenir une valeur approximative et puis convertir en GMT dans mon serveur.

Par exemple, je suis en provenance de Taïwan et elle renvoie la valeur "+8" pour moi.

exemple pratique

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
répondu Terry Lin 2015-06-09 07:04:54

voir cet opérateur résultant était à l'opposé du fuseau horaire .Alors appliquez une fonction mathématique puis validez le nombre moins ou plus.

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
répondu prasanth 2017-07-18 14:07:48

sur le new Date( ) vous pouvez obtenir l'offset, pour obtenir le nom du fuseau horaire que vous pouvez faire:

new Date().toString().replace(/(.*\((.*)\).*)/, '');

, vous obtenez la valeur entre () à la fin de la date, qui est le nom du fuseau horaire.

2
répondu Moysés Lacerda 2018-05-08 16:21:06

comme alternative à new Date().getTimezoneOffset() et moment().format('zz') , vous pouvez également utiliser :

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 buggy et non maintenu ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )

1
répondu brauliobo 2016-06-30 17:21:50

utilisez ceci pour convertir OffSet en postive:

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
0
répondu Kumal Pereira 2017-03-24 08:09:13

Je ne cherchais que la chaîne de 3 lettres (comme" PDT") et j'ai essayé la réponse de Marquez, mais j'ai dû la modifier un peu pour la prise en charge par cross browser. Heureusement, la chaîne est la dernière correspondance potentielle:)

voici ce que j'ai fait, en Coffee-script:

browserTimezone = ->
  userDate = new Date()
  zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
  userZone = zoneMatches[zoneMatches.length - 1]

Works in IE8, IE9, Safari 9, Firefox 44, and Chrome 48

-1
répondu ari gold 2016-03-16 05:54:43

vous juste pour inclure le 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>
-1
répondu Dayachand Patel 2016-12-19 14:04:28

C'est un très bon travail pour moi:

// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;
-1
répondu Alexander 2017-04-23 21:08:34

, vous pouvez simplement essayer cette. il vous retournera le temps machine actuel

var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())

-1
répondu user8066707 2017-05-25 18:10:07

ça fera l'affaire.


var time = new Date(),
timestamp = Date(1000 + time.getTime());
console.log(timestamp);

Thu May 25 2017 21:35:14 GMT+0300 (IDT)

Non défini

-1
répondu SysMurff 2017-05-25 18:35:16