Получить смещение часового пояса от имени часового пояса, используя Javascript

Я нашел много решений, которые дают название часового пояса из значения смещения. Но у меня есть имя часового пояса, и я хочу значение смещения для этого. Я пробовал setTimezone("Азия / Калькутта"), но я думаю, что это не такой метод, как setTimezone.

пример:

Asia/Kolkata should give me -330 ( offset )

4 ответа

Это самый простой способ решить эту задачу с помощью современного JavaScript.

Примечание. Имейте в виду, что смещение зависит от того, активно ли летнее время (DST).

Я столкнулся с этой же проблемой, и это решение, которое я придумал, если вы можете получить имя базы данных IANA tz, подобное тому, которое вы упомянули:

      var myTimezoneName = "Asia/Colombo";
 
// Generating the formatted text
var options = {timeZone: myTimezoneName, timeZoneName: "short"};
var dateText = Intl.DateTimeFormat([], options).format(new Date);
 
// Scraping the numbers we want from the text
var timezoneString = dateText.split(" ")[1].slice(3);

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

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

Это не очень хорошее решение, но оно выполняет свою работу, ничего не импортируя. Он полагается на согласованность формата вывода Intl.DateTimeFormat, что и должно быть, но это потенциальное предостережение.

Вы не можете получить это только по имени. Вам также необходимо знать конкретное время. Asia/Kolkata может быть установлено одно смещение, но многие часовые пояса чередуются между стандартным временем и летним временем, поэтому вы не можете просто получить смещение, вы можете только получить смещение.

Как это сделать в JavaScript, смотрите в этом ответе.

Использование пакета npm для стран и часовых поясов:

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

Выводит на консоль:

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

Оттуда вы можете использовать utcOffset или dstOffset в зависимости от того, летнее время.

Другие вопросы по тегам