Получить текущее смещение GMT ​​от идентификатора часового пояса - PullRequest
0 голосов
/ 02 мая 2020

Как получить текущее смещение по Гринвичу из идентификатора часового пояса? В идеале, это также будет включать в себя длинное имя формы.

Например:

"America/Los_Angeles"  //output: GMT-0700 (Pacific Daylight Time)

Было бы неплохо, если бы он работал и со строками ISO, например:

2020-12-21T03:57:00Z   //output: GMT-0800 (Pacific Standard Time)

1 Ответ

2 голосов
/ 02 мая 2020

Вы можете использовать параметры timeZone и timeZoneName объекта Intl.DateTimeFormat , как показано ниже, чтобы получить имя более распространенных, но менее известных часовых поясов. вероятно, будет отсутствовать. Также:

  1. Вы не можете получить их обоих одновременно, поэтому вам нужно вызвать их дважды
  2. В некоторых случаях вы просто получите короткие и длинные имена без фактическое смещение
  3. Имена часовых поясов не стандартизированы, поэтому разные реализации могут возвращать разные имена или просто фактическое смещение без имени.
  4. Вы получите смещение для даты и времени что вы создаете, а не дату и время для местоположения, поэтому может быть неправильно, если эта разница пересекает границу перехода на летнее время

например

// Get short offset, might show the actual offset but might be a short name
let formatterA = new Intl.DateTimeFormat('en',{timeZone:'America/New_York', timeZoneName:'short'});
console.log( formatterA.format(new Date()) ); // 5/2/2020, EDT

// Get short offset, might show the actual offset but might be a short name
let formatterB = new Intl.DateTimeFormat('en',{timeZone:'America/New_York', timeZoneName:'long'});
console.log( formatterB.format(new Date()) ); // 5/2/2020, Eastern Daylight Time

Другая стратегия получения смещения заключается в создании даты в часовом поясе и получении разницы от даты UT C с тем же годом, месяцем, днем ​​и т. Д. c. значения путем анализа результатов. У этого все еще есть проблема границы летнего времени. Метод Intl.DateTimeFormat.prototype.formatToParts помогает при этом ответе .

Однако я предлагаю вам использовать такую ​​библиотеку, как Luxon в качестве возиться с этой мелочью, возможно, не о чем, особенно о летних изменениях.

var DateTime = luxon.DateTime;

let d = DateTime.fromISO("2017-05-15T09:10:23", { zone: "Europe/Paris" });

console.log(d.toFormat('ZZ'));    // +02:00
console.log(d.toFormat('ZZZZZ')); // Central European Summer Time

let e = DateTime.fromISO("2017-05-15T09:10:23", { zone: "Pacific/Kiritimati" });

console.log(e.toFormat('ZZ'));    // +14:00
console.log(e.toFormat('ZZZZZ')); // Line Islands Time 
<script src="https://cdn.jsdelivr.net/npm/luxon@1.23.0/build/global/luxon.min.js"></script>
...