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

发布于 2025-01-07 07:04:45 字数 294 浏览 0 评论 0原文

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

我想要完成的是将纪元时间转换为可读格式,但它需要位于美国/中部,无论浏览器的操作系统设置如何。因为我使用的是 US/Central,所以它与 GMT 之间没有固定的差异。因此,为什么我不能直接告诉 Javascript 我实际上在美国/中部,而不是一堆超级讨厌的转换步骤?

I know I can get the local timezone offset via new Date().getTimeZoneOffset(). But where did Javascript get that information? Is there a way I can set it, so that all future Date objects have the offset I want? I tried searching the DOM in Firebug, but couldn't find anything.

What I am trying to accomplish is converting epoch times to readable format, but it needs to be in US/Central, no matter what the browser's OS setting. Because I am using US/Central, it's not a fixed difference from GMT. So instead of a bunch of super nasty conversion steps, why can't I just tell Javascript that I'm actually in US/Central?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

2025-01-14 07:04:45

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

ECMAScript 的实现预计将确定本地时区调整。

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

不。

那么,为什么我不能告诉 Javascript 我实际上在美国/中部,而不是一堆超级讨厌的转换步骤呢?

您是否考虑过使用

I know I can get the local timezone offset via new Date().getTimeZoneOffset(). But where did Javascript get that information?

An implementation of ECMAScript is expected to determine the local time zone adjustment.

Is there a way I can set it, so that all future Date objects have the offset I want?

No.

So instead of a bunch of super nasty conversion steps, why can't I just tell Javascript that I'm actually in US/Central?

Have you considered using a library?

故人爱我别走 2025-01-14 07:04:45

目前,Moment-Timezone 使我们能够使用 moment.tz.setDefault()

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

Currently, Moment-Timezone enables us to set the "browser's" default timezone by using moment.tz.setDefault().

You'll have to use moment() instead of Date(), but this is still a nice upgrade over the weird JS Date object.

梦幻的味道 2025-01-14 07:04:45

输出格式

如果您关心输出格式,并且需要在本地时区(例如使用 Intl) 或像 dayjs时刻

从非 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]

Output format

If you are concerned about the output format, you always need to format your Date object prior to outputting it if you need it in a local timezone (e.g. using Intl) or you a library like dayjs or moment.

Create a new Date object from a date with a non-UTC timezone

You can set an offset in pure JS: new Date('2022-10-29T12:50:00.000+02:00') will contain 2022-10-29T10:50:00.000Z. You just have to always specify the timezone offset in /^[+-][0-2]\d:[0-5]\d$/ format.

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

Get timezone offset string from timezone offset number

Now, if you want to get an offset in that format from (new Date()).getTimezoneOffset() (e.g. -120), you need to

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')}`

Get timezone offset string from IANA timezone

// 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]
人事已非 2025-01-14 07:04:45

我意识到这是一篇旧文章,但是 momentJS 是一个强大的 JavaScript 库,用于操作日期/时间对象

I realize this is an old post, but momentJS is a powerful javascript library to manipulate date/time objects

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文