在 JavaScript 中获取来自时区的 utc 偏移量



我需要一个给定时区的Javascript函数,返回当前的UTC偏移量。

例如,theFuncIneed('US/Eastern') -> 240

现在使用Intl API 已经成为可能:

Intl的实施基于icu4c。如果您挖掘源代码,您会发现时区名称因区域设置而异,例如:

for (const locale of ["ja", "en", "fr"]) {
const timeZoneName = Intl.DateTimeFormat(locale, {
timeZoneName: "short",
timeZone: "Asia/Tokyo",
})
.formatToParts()
.find((i) => i.type === "timeZoneName").value;
console.log(timeZoneName);
}

幸运的是,有一个区域设置,国际语言(语言标签是ia),它使用相同的模式(例如。GMT+11:00) 作为时区名称。

下面的代码片段可以满足您的需求:

const getOffset = (timeZone) => {
const timeZoneName = Intl.DateTimeFormat("ia", {
timeZoneName: "short",
timeZone,
})
.formatToParts()
.find((i) => i.type === "timeZoneName").value;
const offset = timeZoneName.slice(3);
if (!offset) return 0;
const matchData = offset.match(/([+-])(d+)(?::(d+))?/);
if (!matchData) throw `cannot parse timezone name: ${timeZoneName}`;
const [, sign, hour, minute] = matchData;
let result = parseInt(hour) * 60;
if (sign === "+") result *= -1;
if (minute) result += parseInt(minute);
return result;
};
console.log(getOffset("US/Eastern")); // 240
console.log(getOffset("Atlantic/Reykjavik")); // 0
console.log(getOffset("Asia/Tokyo")); // -540

这种方式可能有点棘手,但在我的生产项目中效果很好。我希望它也对你有所帮助:)

更新

非常感谢Bart指出错别字。我已经更正了代码片段。

一般来说,这是不可能的。

  • US/Eastern时区的标识符。 (它实际上是America/New_York的别名,这是真正的标识符。

  • 240是时区偏移量。 它通常写成-04:00(反转符号,除以 60)。

  • 美国东部时区由东部标准时间(偏移量为-05:00)和东部夏令时(偏移量为-04:00)组成。

因此,说US/Eastern= 240根本不准确。 请阅读时区标签维基,特别是标题为"时区!=偏移量"的部分。

现在您确实要求当前偏移量,这是可能的。 如果提供日期+时间引用,则可以解决此问题。

  • 对于执行 javascript 代码的计算机的本地时区,这是内置的,其中包含来自Date对象的任何实例的.getTimezoneOffset()

  • 但是,如果您希望它适用于特定时区,那么您需要使用我在此处列出的库之一。

以下函数可用于返回给定时区的 UTC 偏移量:

const getTimezoneOffset = (timeZone, date = new Date()) => {
const tz = date.toLocaleString("en", {timeZone, timeStyle: "long"}).split(" ").slice(-1)[0];
const dateString = date.toString();
const offset = Date.parse(`${dateString} UTC`) - Date.parse(`${dateString} ${tz}`);

// return UTC offset in millis
return offset;
}

它可以像这样使用:

const offset = getTimezoneOffset("Europe/London");
console.log(offset);
// expected output => 3600000

您可以使用moment执行此操作.js

moment.tz('时区名称').utcOffset()

尽管这涉及使用时刻时区.js

@ranjan_purbey的答案对我来说是NaN,而@Weihang Jian的答案在Chrome中抛出了一个异常(但在Firefox中有效)。

因此,基于所有答案,我想出了以下功能,它基本上是两个答案的组合,对我来说成功地协同工作:

function getTimeZoneOffset(timeZone) {
const date = new Date().toLocaleString('en', {timeZone, timeZoneName: 'short'}).split(' ');
const timeZoneName = date[date.length - 1];
const offset = timeZoneName.slice(3);
if (!offset) {
return 0;
}
const matchData = offset.match(/([+-])(d+)(?::(d+))?/);
if (!matchData) {
throw new Error(`Cannot parse timezone name: ${timeZoneName}`);
}
const [, sign, hour, minute] = matchData;
let result = parseInt(hour, 10) * 60;
if (sign === '+') {
result *= -1;
}
if (minute) {
result += parseInt(minute, 10);
}
return result;
}

相关内容

  • 没有找到相关文章

最新更新