如何从js中的时区获取UTC偏移量

时间:2020-08-11 07:34:48

标签: javascript

在Vanilla JavaScript中(即不使用Moment.js )。

我有一台服务器返回时区字符串,例如Asia/Tokyo America/New_York等。 该时区与用户当前时区无关。因此,当我当前的操作系统时区为Asia/Tokyo

时,服务器可以返回America/New_York

在给定时区的服务器上,我想将其格式化为=>

UTC+09:00 Asia/Tokyo

因此,简单地说,我只想从给定的时区中找到该时区的UTC偏移量。

JS中有一个本机函数getTimezoneOffset,但是我找不到setTimezone

我试图做类似的事情

var d = new Date()
new Date(d.toLocaleString('en-US', { timeZone: 'Asia/Tokyo' })).getTimezoneOffset()

但这总是返回我当前的偏移量。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您可以使用Date.toLocaleString()来计算此值,该解决方案有点不可靠,因为我们先格式化日期,然后解析。但是它应该做您想要的。

我将转换为“ sv”日期格式,因为它与ISO-8601非常相似,然后进行解析以获取UTC日期。

注意:格林威治子午线以东的时区偏移量为负,这与IANA约定相同。如果您希望在UTC提前 分钟后获得UTC偏移,则可以简单地进行反转。 另外,我将在四舍五入,因为我们的原始日期将包含我们不感兴趣的毫秒部分。

function getUTCOffset(date, timeZone) {
    const dateComponents = date.toLocaleString("sv", { timeZone }).split(/[\-\s:]/);
    // Months are zero-based in JavaScript
    dateComponents[1] = dateComponents[1] - 1;
    const utcDate = Date.UTC(...dateComponents);
    return Math.round((date - utcDate) / 60 / 1000);
}

console.log(getUTCOffset(new Date(), 'Asia/Tokyo'));
console.log(getUTCOffset(new Date(), 'America/Los_Angeles'));