web-dev-qa-db-fra.com

Détecter l'abréviation de fuseau horaire à l'aide de JavaScript

J'ai besoin d'un moyen de détecter le fuseau horaire d'un objet de date donné. Je ne veux pas le décalage, ni le nom complet du fuseau horaire. J'ai besoin d'obtenir l'abréviation du fuseau horaire. Par exemple, GMT, UTC, PST, MST, CST, EST, etc ...

Est-ce possible? Le plus proche que j'ai eu est d'analyser le résultat de date.toString (), mais même cela ne me donnera pas une abréviation. Cela me donne le nom long du fuseau horaire.

35
spudly

Si tout échoue, vous pouvez simplement créer votre propre table de hachage avec les noms longs et les abréviations .

6
Andy West

Une solution native:

var zone = new Date().toLocaleTimeString('en-us',{timeZoneName:'short'}).split(' ')[2]
console.log(zone)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

47
Stephen DuMont

[désolé pour la façon dont j'écris en anglais]

Bonjour, l'objet date n'a pas de méthode pour obtenir l'abréviation de fuseau horaire, mais il est implicite à la fin du retour de toString:

par exemple

var rightNow = new Date();
alert(rightNow);

la sortie sera quelque chose comme "Mer 30 Mars 2011 17:29:16 GMT-0300 (ART)" Donc, vous pouvez isoler ce qui est entre parenthèses "ART" qui est l'abréviation de fuseau horaire

var rightNow = new Date();
alert(String(String(rightNow).split("(")[1]).split(")")[0]);

la sortie sera "ART"

il est trop tard pour répondre, mais j'espère que ce sera utile pour quelqu'un

15
Diego125k

moment-timezone inclut une méthode non documentée .zoneAbbr() qui renvoie l'abréviation du fuseau horaire. Cela nécessite également un ensemble de règles pouvant être sélectionnées et téléchargées en fonction des besoins.

Ce faisant:

<script src="moment.js"></script>
<script src="moment-timezone.js"></script>
<script src="moment-timezone-data.js"></script>
<script>
    moment().tz("America/Los_Angeles").zoneAbbr();
</script>

Résultats:

'PDT' // As of this posting.

Edit (février 2018)

Evan Czaplicki a travaillé sur un projet de proposition visant à ajouter une API de fuseau horaire aux navigateurs .

13
absynce

Cela fonctionne parfaitement dans Chrome, Firefox mais uniquement dans IE11. Dans IE11, les fuseaux horaires sans abréviations directes telles que "Indian Chagos Time" renverront "ICT" au lieu du "IOT" approprié

var result = "unknown";
try{
    // Chrome, Firefox
    result = /.*\s(.+)/.exec((new Date()).toLocaleDateString(navigator.language, { timeZoneName:'short' }))[1];
}catch(e){
    // IE, some loss in accuracy due to guessing at the abbreviation
    // Note: This regex adds a grouping around the open paren as a
    //       workaround for an IE regex parser bug
    result = (new Date()).toTimeString().match(new RegExp("[A-Z](?!.*[\(])","g")).join('');
}
console.log(result);

Résultat:

"CDT"
5
Charlie

Mis à jour pour 2015:

jsTimezoneDetect peut être utilisé avec moment-timezone pour obtenir l'abréviation du fuseau horaire côté client:

moment.tz(new Date(), jstz.determine().name()).format('z');  //"UTC"

Moment-timezone ne peut pas le faire lui-même, car sa fonction qui permettait de gérer cela était dépréciée car elle ne fonctionnait pas dans toutes les circonstances: https://github.com/moment/moment/issues/162 pour obtenir le abréviation du fuseau horaire côté client.

2
Jordan

C'est un sujet délicat. D'après ce que je comprends, le fuseau horaire n'est pas intégré à l'objet Date lors de sa création. Vous ne pouvez pas non plus définir le fuseau horaire d'un objet Date. Cependant, il existe un décalage de fuseau horaire que vous pouvez obtenir à partir d'un objet Date, qui est déterminé par les paramètres du système hôte de l'utilisateur (fuseau horaire). Considérez le fuseau horaire comme un moyen de déterminer le décalage par rapport au temps UTC.

Pour rendre la vie plus facile, je recommande vivement moment et moment-timezone pour gérer ces choses. Moment crée un objet wrapper pour Date avec une API Nice pour toutes sortes de choses.

Si un objet de date existant vous est fourni via un paramètre ou quelque chose, vous pouvez le transmettre au constructeur lors de la création d'un objet moment et vous êtes prêt à lancer. À ce stade, vous pouvez utiliser moment-timezone pour deviner le nom du fuseau horaire de l'utilisateur, puis utiliser instant-timezone formating pour obtenir l'abréviation du fuseau horaire. Je me risquerais à dire que le fuseau horaire de la plupart des utilisateurs est défini automatiquement, mais vous ne devez pas vous fier à cela pour une précision de 100%. Si nécessaire, vous pouvez également définir le fuseau horaire que vous souhaitez utiliser manuellement avant d'extraire le format dont vous avez besoin.

En général, lorsque vous travaillez avec la date et l'heure, il est préférable de stocker l'heure UTC dans votre base de données, puis d'utiliser l'instant js pour formater l'heure du fuseau horaire de l'utilisateur lors de son affichage. Il peut arriver que vous deviez vous assurer que le fuseau horaire est correct. Par exemple, si vous autorisez un utilisateur à planifier quelque chose pour une date et une heure spécifiques. Vous devez absolument vous assurer qu'avec un utilisateur de la côte ouest, vous définissez le fuseau horaire sur PDT/PST avant de convertir en UTC pour le stockage dans votre base de données.

En ce qui concerne l’abréviation de fuseau horaire ...
Voici un exemple de base pour obtenir l’abréviation de fuseau horaire en utilisant moment et moment-fuseau horaire.

// if all you need is the user's timezone abbreviation you don't even need a date object.
const usersTimezoneName = moment.tz.guess()
const timezoneAbbr = moment().tz(usersTimezoneName).format('z')
console.log(timezoneAbbr) // PST (depending on where the user is)

// to manually set the timezone
const newYorkAbbr = moment(dateObj).tz('America/New_York').format('z')
console.log(newYorkAbbr) // EST

Pour afficher un objet de date spécifique avec des décalages pour un fuseau horaire spécifique, vous pouvez le faire .

const xmas = new Date('December 25, 2017 16:20:00')
const losAngelesXmas = moment(xmas).tz('America/Los_Angeles')
console.log(losAngelesXmas.format("dddd, MMMM Do YYYY, h:mm:ss a")) // Monday, December 25th 2017, 4:20:00 pm
1
Will Schoenberger

Je sais que le problème persiste en ce qui concerne les différences entre les navigateurs, mais c’est ce que j’avais l'habitude d'obtenir dans Chrome. Cependant, ce n'est toujours pas une abréviation, car Chrome renvoie le nom long.

new Date().toString().replace(/^.*GMT.*\(/, "").replace(/\)$/, "")
1
Gary

Pour un support crossbrowser, je vous recommande d’utiliser YUI 3 Library:

Y.DataType.Date.format(new Date(), {format:"%Z"});

Il supporte strftime identifiants.

Pour plus d'informations: http://yuilibrary.com/yui/docs/datatype/#dates

1
Renato

Essayez la classe de fermeture de Google goog.i18n.DateTimeSymbols et leurs classes associées aux paramètres régionaux. 

0
yannis

Pas possible avec JavaScript vanille. Les navigateurs ne sont pas cohérents pour renvoyer des chaînes de fuseau horaire. Certains renvoient des décalages comme +0700 tandis que d'autres renvoient PST.

Ce n'est pas cohérent ou fiable, c'est pourquoi vous avez besoin d'un script tiers, tel que moment.js (et moment-timezone.js), ou créez votre propre hashtable pour la conversion entre les décalages et les abréviations de fuseau horaire.

0
Jake Wilson

Voici un affichage JavaScript de la date et de l'heure au format 12 heures au format JavaScript qui s'auto-met à jour automatiquement, mais qui peut aider les autres, car il est lié et s'appuie sur Stephen DuMont solution et MDN lien. W3 Schools avait un tutoriel très utile, et les mises à jour en temps réel ne nécessitent pas d'actualisation de la page. 

Les tests avec les dernières versions de bureau FireFox, Chrome, Opera et Internet Explorer 11 fonctionnent tous. L’heure «2 chiffres» apparaît uniquement comme préfixe zéro pour les valeurs uniques dans IE, mais les minutes renvoient de manière fiable une valeur à 2 chiffres pour tous les navigateurs. Les tests avec Windows Safari abandonné fonctionnent, mais le format 12 heures est ignoré et les secondes ne sont pas masquées.

La fonction inclut le fuseau horaire local, ainsi que des options réglables pour les langues de secours, l'affichage du jour et de la date et le format 12/24 heures. La date et l'heure ont été fractionnées pour ajouter la chaîne de séparation "at". Définir uniquement 'toLocaleTimeString' avec les options sélectionnées renverra également la date et l'heure. Les pages MDN peuvent être référencées pour les options et les valeurs. 

<!--
function dateTimeClock() {
  var date = new Date();
  document.getElementById('timedate').innerHTML = date.toLocaleDateString(['en-us', 'en-GB'], {
      weekday: 'long',
      month: 'long',
      day: '2-digit',
      year: 'numeric'
    }) + ' at ' +
    date.toLocaleTimeString(['en-us', 'en-GB'], {
      hour12: 'true',
      hour: '2-digit',
      minute: '2-digit',
      timeZoneName: 'short'
    });
  var t = setTimeout(dateTimeClock, 500);
}

function start() {
  dateTimeClock();
}
window.onload = start;
//-->
<div id="timedate"></div>

0
Kim_Keown

J'ai été capable d'y parvenir en un instant.

moment.tz(moment.tz.guess()).zoneAbbr() //IST
0
vineeth61