我知道我可以通过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
)或dayjs
或moment
之类的库中需要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]