我建议不要直接使用 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")));
是的,目前还没有本地化的内容可用。
好吧,这个列表很常见,而且很容易放入哈希映射中。
https://github.com/vvo/tzdb/blob/main/raw-time-zones.json
或者使用提到的库。
在将日期发送到服务器之前,您需要以ISO格式(与时区无关)发送它。您可以使用本地的 new Date().toISOString()
方法来实现。
将ISO日期保存在数据库中。
一旦返回到客户端,您可以解析ISO日期,它会自动解析为用户的本地时区。
Date.toLocaleString()
来使用语言ia
获得小时和分钟的偏移量,结果将会是格式为GMT+HMM的UTC偏移量,例如GMT+5:30
。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; }