我可以通过Javascript在浏览器中设置本地时区吗

Can I set the local timezone in my browser via Javascript?

本文关键字:时区 设置 可以通过 Javascript 浏览器      更新时间:2023-09-26

我知道我可以通过new Date().getTimeZoneOffset()获得本地时区偏移量。但是Javascript从哪里得到的信息?有没有一种方法可以设置它,以便所有未来的Date对象都有我想要的偏移量?我尝试在Firebug中搜索DOM,但找不到任何内容。

我试图实现的是将epoch时间转换为可读格式,但无论浏览器的操作系统设置如何,它都需要在US/Central中。因为我使用的是US/Central,所以它与GMT没有固定的区别。所以,与其说是一堆非常讨厌的转换步骤,为什么我不能告诉Javascript我实际上在US/Centre呢?

当前,Moment Timezone允许我们使用moment.tz.setDefault()设置"浏览器"的默认时区。

您将不得不使用moment()而不是Date(),但这仍然是对奇怪的JS-Date对象的一个很好的升级。

我知道我可以通过new Date().getTimeZoneOffset()获得本地时区偏移量。但是Javascript从哪里得到的信息呢?

ECMAScript的实现有望确定本地时区调整。

有没有一种方法可以设置它,以便所有未来的Date对象都有我想要的偏移量?

没有。

所以,与其说是一堆非常讨厌的转换步骤,为什么我不能告诉Javascript我实际上在美国/中央呢?

你考虑过使用图书馆吗?

我意识到这是一篇老文章,但momentJS是一个强大的javascript库,可以操作日期/时间对象

输出格式

如果您关心输出格式,如果您在本地时区(例如使用Intl)或dayjsmoment之类的库中需要Date对象,则始终需要在输出之前对其进行格式化。

从具有非UTC时区的日期创建新的Date对象

您可以在纯JS中设置偏移:new Date('2022-10-29T12:50:00.000+02:00')将包含2022-10-29T10:50:00.000Z。您只需要始终以/^[+-][0-2]'d:[0-5]'d$/格式指定时区偏移即可。

console.log(new Date('2022-10-29T12:50:00.000+02:00').toISOString())
// Output
// 2022-10-29T10:50:00.000Z

从时区偏移编号中获取时区偏移字符串

现在,如果你想从(new Date()).getTimezoneOffset()(例如-120)获得该格式的偏移量,你需要

const tzOffsetNumber = (new Date()).getTimezoneOffset()
const tzOffsetString = `${tzOffsetNumber > 0 ? '+' : '-'}${Math.floor(Math.abs(tzOffsetNumber) / 60).toString().padStart(2, '0')}:${(Math.abs(tzOffsetNumber) % 60).toString().padStart(2, '0')}`

从IANA时区获取时区偏移字符串

// Note: We need to specify a date in order to also consider DST settings.
const date = new Date()
const ianaTimezone = 'Europe/Bratislava'
const tzOffsetString = new Intl.DateTimeFormat('en', {timeZone: ianaTimezone, timeZoneName: 'longOffset'}).format(date).match(/['d+:-]+$/)?.[0]