我需要一个 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
这种方法可能有点棘手,但在我的生产项目中效果很好。我希望它也对你有帮助:)
Update
非常感谢 Bort 指出错误。我已经更正了该片段。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)