如何从时区获取UTC偏移量

3
在Node中,如何将时区(例如 Europe/Stockholm)转换为特定时间点的UTC偏移量(例如+1+2)?Temporal似乎在未来会解决这个问题,但在那之前呢?这是否可以在本地实现,还是需要像tzdb这样的工具包?
4个回答

3

我建议不要直接使用 tzdb,而是使用一个能够良好处理时区的日期库。特别地,我发现 Luxon 是很好的选择,可以查看 该文档有关时区处理的说明。要获取偏移量,只需创建一个带有所需时区的 DateTime,然后获取其 .offset 属性即可:

const dateInZone = DateTime.fromISO("2022-10-23T21:10:56Z", {
  zone: "Europe/Stockholm"
});
console.log(dateInZone.offset)

或者,创建一个Zone实例,并在特定时间戳上获取其.offset()

const zone = new IANAZone("Europe/Stockholm");
console.log(zone.offset(Date.parse("2022-10-23T21:10:56Z")));

1
为了完整性:还有一个Temporal polyfill https://github.com/js-temporal/temporal-polyfill - leo

1

1
请注意:该列表并不能保证“现在”是正确的,只有在创建时才是正确的。因为观察哪些时区的地方会发生变化,比你想象的要多得多。 - Mike 'Pomax' Kamermans

1
我不知道你具体的使用情况,但是一般来说应该按照以下工作流程进行操作:
  1. 在将日期发送到服务器之前,您需要以ISO格式(与时区无关)发送它。您可以使用本地的 new Date().toISOString() 方法来实现。

  2. 将ISO日期保存在数据库中。

  3. 一旦返回到客户端,您可以解析ISO日期,它会自动解析为用户的本地时区。


1
我们可以使用Date.toLocaleString()来使用语言ia获得小时和分钟的偏移量,结果将会是格式为GMT+HMM的UTC偏移量,例如GMT+5:30
我们可以使用正则表达式来获取HHMM偏移量,例如+5:30、-8:00,这可以轻松转换为以分钟为单位的UTC偏移量。
我认为通常最好使用库,比如luxon来获取UTC偏移量(如另一个答案所示),但是它也可以在Vanilla JS中实现。

function getUTCOffsetHHMM(date, timeZone) {
    const fmt = date.toLocaleString('ia', { timeZoneName: 'longOffset', timeZone });
    return fmt.replace(/^.*? GMT/, '');
}

function getUTCOffsetMinutes(date, timeZone) {
    const hhmm = getUTCOffsetHHMM(date, timeZone);
    return parseHHMM(hhmm);
}

function parseHHMM(hhmm) {
    const [h, m] = hhmm.split(':').map(Number);
    return h * 60 + (m || 0) * (h < 0 ? -1: +1); 
}

const now = new Date();
const timeZones = ['America/Los_Angeles', 'America/St_Johns', 'Europe/Berlin', 'Asia/Kolkata', 'Asia/Tokyo'];
   
console.log('Timezone'.padEnd(22), 'UTC Offset (hh:mm)', 'UTC Offset (minutes)');
for(let timeZone of timeZones) { 
    console.log(timeZone.padEnd(22), getUTCOffsetHHMM(now, timeZone).padEnd(18), getUTCOffsetMinutes(now, timeZone)); 
}
.as-console-wrapper { max-height: 100% !important; }


1
谢谢。我想这从技术上来说是我的问题的答案,但使用一个库似乎是值得的。 - leo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接