Ermitteln Sie mithilfe von Javascript den Zeitzonen-Offset vom Zeitzonennamen

Lesezeit: 4 Minuten

Ich habe viele Lösungen gefunden, die den Zeitzonennamen aus dem Offsetwert ergeben. Aber ich habe einen Zeitzonennamen und möchte dafür einen Offset-Wert. Ich habe setTimezone(‘Asia/Kolkata’) ausprobiert, aber ich denke, dass es keine Methode wie setTimezone gibt.

Beispiel:

Asia/Kolkata should give me -330 ( offset )

  • Hast du es versucht momentjs.com ?

    – Anto Subash

    24. Januar 2014 um 8:20

  • Mal sehen, ob ich Ihre Situation verstanden habe. Sie haben eine Zeitzone A und möchten den Zeitunterschied zwischen der anderen Zeitzone B ermitteln. Meine Frage ist … Ihre Variable sind die beiden Zeitzonen, daher ändern sich beide Zeitzonen häufig? Oder kann sich nur eine dieser Zeitzonen ändern, zum Beispiel gibt es einen Client mit einer Zeitzone und Sie wissen nur eine, um den Zeitunterschied zwischen dem Client und Ihrem Server zu kennen?

    – Benutzer688877

    24. Januar 2014 um 11:40 Uhr

  • Es ändert sich nur eine Zeitzone … Die Zeitzone des Servers ist fest und ist UTC 0. Wenn die Client-Zeitzone Asien/Kolkata ist, möchte ich in diesem Fall einen Offset dieser Zeitzone (bedeutet -330 Minuten).

    – Hardik Sondagar

    25. Januar 2014 um 9:49

Dies ist der einfachste Weg, diese Aufgabe mit modernem JavaScript zu erledigen.

Notiz: Beachten Sie, dass der Offset davon abhängt, ob die Sommerzeit (DST) aktiv ist.

/* @return A timezone offset in minutes */
const getOffset = (timeZone="UTC", date = new Date()) => {
  const utcDate = new Date(date.toLocaleString('en-US', { timeZone: 'UTC' }));
  const tzDate = new Date(date.toLocaleString('en-US', { timeZone }));
  return (tzDate.getTime() - utcDate.getTime()) / 6e4;
}

console.log(`No arguments: ${getOffset()}`); // 0

{
  console.log('! Test Case #1 >> Now');
  console.log(`Asia/Colombo     : ${getOffset('Asia/Colombo')}`);     //  330
  console.log(`America/New_York : ${getOffset('America/New_York')}`); // -240
}

{
  console.log('! Test Case #2 >> DST : off');
  const date = new Date(2021, 0, 1);
  console.log(`Asia/Colombo     : ${getOffset('Asia/Colombo', date)}`);     //  330
  console.log(`America/New_York : ${getOffset('America/New_York', date)}`); // -300
}

{
  console.log('! Test Case #3 >> DST : on');
  const date = new Date(2021, 5, 1);
  console.log(`Asia/Colombo     : ${getOffset('Asia/Colombo', date)}`);     //  330
  console.log(`America/New_York : ${getOffset('America/New_York', date)}`); // -240
}
.as-console-wrapper { top: 0; max-height: 100% !important; }

Benutzer-Avatar von Baptiste Higgs
Baptiste Higgs

Ich bin auf dasselbe Problem gestoßen, und das ist die Lösung, die ich gefunden habe, falls Sie eine bekommen können Name der IANA tz-Datenbank wie das von dir erwähnte:

const myTimezoneName = "Asia/Colombo";
 
// Generating the formatted text
// Setting the timeZoneName to longOffset will convert PDT to GMT-07:00
const options = {timeZone: myTimezoneName, timeZoneName: "longOffset"};
const dateText = Intl.DateTimeFormat([], options).format(new Date);
 
// Scraping the numbers we want from the text
// The default value '+0' is needed when the timezone is missing the number part. Ex. Africa/Bamako --> GMT
let timezoneString = dateText.split(" ")[1].slice(3) || '+0';

// Getting the offset
let timezoneOffset = parseInt(timezoneString.split(':')[0])*60;

// Checking for a minutes offset and adding if appropriate
if (timezoneString.includes(":")) {
   timezoneOffset = timezoneOffset + parseInt(timezoneString.split(':')[1]);
}

Es ist nicht sehr Hübsch Lösung, aber es erledigt den Job, ohne etwas zu importieren. Es setzt voraus, dass das Ausgabeformat von Intl.DateTimeFormat konsistent ist, was auch sein sollte, aber das ist ein potenzieller Nachteil.

  • Danke schön! Nach langem Suchen habe ich hier endlich meine Antwort gefunden. Sehr geschätzt.

    – Armando

    1. Juli 2021 um 12:48

  • Beachten Sie, dass dies nicht immer funktioniert, da im „kurzen“ Format einige Zeitzonen durch ihren Namen wie „PST“ und nicht durch ihren Offset dargestellt werden. Der bessere Ansatz wäre, die Zeitzone im „shortOffset“-Format auszugeben, aber diese Option wird in Node.js nicht unterstützt.

    – Alexander Korostin

    16. Januar 2022 um 21:43 Uhr


  • Node.js unterstützt jetzt die Optionen „shortOffset“ und „longOffset“ für timeZoneName.

    – diachedelisch

    24. Juni 2022 um 2:22

  • Gute Antwort. Es bedarf jedoch einer Optimierung. Die Zeile, die die Zahl aus dem Text entfernt, funktioniert nicht für Zeitzonen, die in GMT statt in GMT+0 aufgelöst werden. Ich werde die Antwort aktualisieren, um einen Fix hinzuzufügen.

    – asiby

    24. Juni 2022 um 15:19 Uhr

  • @AlexanderKorostin, die Verwendung von „longOffset“ als Zeitzonenformat wird das lösen. Ich habe die Antwort noch einmal bearbeitet, um das zu beheben.

    – asiby

    24. Juni 2022 um 16:41

Benutzeravatar von Matt Johnson-Pint
Matt Johnson-Pint

Man kann es nicht allein anhand des Namens verstehen. Sie müssten auch die genaue Uhrzeit kennen. Asia/Kolkata kann auf einen einzelnen Zeitversatz festgelegt sein, aber viele Zeitzonen wechseln zwischen Standardzeit und Sommerzeit, sodass Sie nicht einfach darauf zugreifen können Die Offset kann man nur bekommen ein versetzt.

Informationen zur Vorgehensweise in JavaScript finden Sie in dieser Antwort.

Benutzeravatar von Nathan Dullea
Nathan Dullea

Benutzen Länder und Zeitzonen npm-Paket:

import {getTimezone} from 'countries-and-timezones';
const australianTimezone="Australia/Melbourne";
console.log(getTimezone(australianTimezone));

Druckt auf der Konsole:

{
  name: 'Australia/Melbourne',
  country: 'AU',
  utcOffset: 600,
  utcOffsetStr: '+10:00',
  dstOffset: 660,
  dstOffsetStr: '+11:00',
  aliasOf: null
}

Von dort aus können Sie utcOffset oder dstOffset verwenden, je nachdem, ob Sommerzeit ist.

1453030cookie-checkErmitteln Sie mithilfe von Javascript den Zeitzonen-Offset vom Zeitzonennamen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy