web-dev-qa-db-fra.com

Obtenir le fuseau horaire du navigateur de l'utilisateur en utilisant moment (timezone) .js

Quel est le meilleur moyen d'obtenir le fuseau horaire du client et de le convertir en un autre fuseau lorsque vous utilisez moment.js et moment-timezone.js

Je veux savoir quel est le fuseau horaire du client et convertir plus tard sa date et son heure en un autre fuseau horaire.

Est-ce que quelqu'un a de l'expérience avec ça?

51
nemo_87

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

Cela renvoie la différence entre le fuseau horaire du client et l'heure UTC. Vous pouvez ensuite jouer avec comme vous voulez.

14
jogoe

Lorsque vous utilisez moment.js, utilisez:

var tz = moment.tz.guess();

Il renverra un identifiant de fuseau horaire IANA, tel que America/Los_Angeles pour le fuseau horaire US Pacific.

C'est documenté ici .

En interne, il essaie d’abord d’obtenir le fuseau horaire du navigateur en utilisant l’appel suivant:

Intl.DateTimeFormat().resolvedOptions().timeZone

Si vous ne ciblez que les navigateurs modernes prenant en charge cette fonction et que vous n'avez pas besoin de Moment-Timezone pour autre chose, vous pouvez simplement l'appeler directement.

Si Moment-Timezone n'obtient pas un résultat valide de cette fonction, ou si cette fonction n'existe pas, il "devinera" le fuseau horaire en testant plusieurs dates et heures différentes par rapport à l'objet Date à voir. comment ça se comporte. La supposition est généralement une approximation suffisante, mais il n’est pas garanti qu’elle corresponde exactement au réglage du fuseau horaire de l'ordinateur.

164

Lors de l'utilisation de moment.js , moment(date).utcOffset() renvoie l'écart en minutes entre l'heure du navigateur et l'heure UTC à la date passée en tant que argument (ou aujourd'hui, si aucune date n'est passée).
NE PAS définir cette différence dans une variable et l'utiliser pour la date choisie:

// this is WRONG! don't do it like this!
const OFFSET_UTC = moment().utcOffset();

Ce qui précède applique la différence en cours à toutes les dates avec lesquelles vous travaillez. Si vous êtes dans une zone d’heure d’été, vos dates seront décalées d’une heure si elles se trouvent dans l’autre moitié de l’année.

Voici une fonction pour analyser le décalage correct à la date choisie:

function getUtcOffset(date) {
  return moment(date)
    .add(
      moment(date).utcOffset(), 
      'minutes')
    .utc()
}
5
Andrei Gheorghiu

Vous pouvez également obtenir votre temps désiré en utilisant le code JS suivant:

new Date(`${post.data.created_at} GMT+0200`)

Dans cet exemple, les dates que j'ai reçues étaient au fuseau horaire GMT + 0200. Au lieu de cela peut être chaque fuseau horaire. Et les données renvoyées seront la date dans votre fuseau horaire. J'espère que cela aidera tout le monde à gagner du temps

1
David

Utilisation de la bibliothèque Moment sur leur site Web -> https://momentjs.com/timezone/docs/#/using-timezones/converting) -to-zone /

Je remarque qu'ils utilisent également leur propre bibliothèque sur leur site Web. Vous pouvez donc essayer d'utiliser la console du navigateur avant de l'installer

moment().tz(String);

The moment#tz mutator will change the time zone and update the offset.

moment("2013-11-18").tz("America/Toronto").format('Z'); // -05:00
moment("2013-11-18").tz("Europe/Berlin").format('Z');   // +01:00

This information is used consistently in other operations, like calculating the start of the day.

var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.format();                     // 2013-11-18T11:55:00-05:00
m.startOf("day").format();      // 2013-11-18T00:00:00-05:00
m.tz("Europe/Berlin").format(); // 2013-11-18T06:00:00+01:00
m.startOf("day").format();      // 2013-11-18T00:00:00+01:00

Without an argument, moment#tz returns:

    the time zone name assigned to the moment instance or
    undefined if a time zone has not been set.

var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.tz();  // America/Toronto
var m = moment.tz("2013-11-18 11:55");
m.tz() === undefined;  // true
0
Philippe