95 votes

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

Quelle est la meilleure façon d'obtenir le fuseau horaire du client et de le convertir en un autre fuseau horaire en utilisant moment.js et moment-timezone.js ?

Je veux savoir quel est le fuseau horaire du client et convertir ensuite sa date et son heure dans un autre fuseau horaire.

Quelqu'un a-t-il une expérience dans ce domaine ?

0 votes

Maintenant, puisque le moment n'est plus d'actualité. Vérifiez stackoverflow.com/a/34602679/4050261 pour un one liner super simple sans aucune bibliothèque.

276voto

Matt Johnson Points 33433

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 américain du Pacifique.

Il 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 qui prennent en charge cette fonction, et que vous n'avez pas besoin de Moment-Timezone pour autre chose, vous pouvez l'appeler directement.

Si Moment-Timezone n'obtient pas de 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 à la fonction Date pour voir comment il se comporte. La supposition est généralement une assez bonne approximation, mais il n'est pas garanti qu'elle corresponde exactement au réglage du fuseau horaire de l'ordinateur.

0 votes

Voir aussi cette réponse et cette réponse .

2 votes

Excellente réponse - Upvoted ! Veuillez également utiliser momet-timezone version 0.5.4 ou plus... veuillez suivre ce fil pour plus d'explications github.com/moment/moment-timezone/issues/324

4 votes

+1. Assurez-vous que vous utilisez le moment avec la date pour utiliser le crochet tz. momentjs.com/timezone/docs pour l'installer avec node.js utilisez cette commande npm install moment-timezone puis l'exiger comme ceci window.moment = require('moment-timezone');

19voto

jogoe Points 399
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 le souhaitez.

57 votes

Cela renvoie le actuel fuseau horaire décalage . Pas le fuseau horaire. Le décalage peut changer, en fonction de choses comme l'heure d'été. Voir "Fuseau horaire != Décalage" dans la balise de fuseau horaire wiki

11 votes

La réponse de @MattJohnson est la vraie réponse à cette question. Techniquement, cette réponse est incorrecte car elle est liée au décalage et non au fuseau horaire (concepts différents).

1 votes

Cela ne fonctionne pas dans Firefox, new Date() crée un objet date dans le fuseau horaire UTC, il est donc inutile d'utiliser getTimezoneOffset() sur celui-ci.

8voto

Andrei Gheorghiu Points 3898

Toutes les réponses actuelles fournissent la différence d'offset à l'heure actuelle, et non à une date donnée.

moment(date).utcOffset() renvoie la différence de temps en minutes entre l'heure du navigateur et l'UTC. à la date passée en argument (ou aujourd'hui, si aucune date n'est passée).

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

function getUtcOffset(date) {
  return moment(date)
    .subtract(
      moment(date).utcOffset(), 
      'minutes')
    .utc()
}

1 votes

La fonction est en fait utcOffset() pas offsetUtc() :)

2 votes

@Milkncookiez, j'ai mis à jour la réponse. Merci. Je n'ai aucune idée de la façon dont je les ai inversés (il se peut qu'ils fonctionnent dans les deux sens ou qu'ils aient été modifiés dans une version antérieure - la probabilité que je publie quelque chose que je n'ai pas testé est proche de 10 %. null ).

6voto

Philippe Points 325

Utilisation de Moment bibliothèque, voir leur site web -> https://momentjs.com/timezone/docs/#/using-timezones/converting-to-zone/

j'ai remarqué qu'ils utilisent également leur propre bibliothèque sur leur site web, vous pouvez donc faire un essai en utilisant 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

1voto

David Points 307

Vous pouvez également obtenir l'heure souhaitée en utilisant le code JS suivant :

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

Dans cet exemple, les dates reçues étaient dans le fuseau horaire GMT+0200. Au lieu de cela, il peut s'agir de n'importe quel fuseau horaire. Et les données renvoyées seront la date dans votre fuseau horaire. J'espère que cela vous aidera à gagner du temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X