在不使用正常 JavaScript 函数 'getTimezoneOffset' 的情况下获取客户时区?

Getting client's TimeZone without using the normal JavaScript funtion 'getTimezoneOffset'?

我目前正在网站上制作注册表,我需要确切地知道如何为活跃的用户客户端获取时区偏移量以计算他的实际本地时间(不需要夏令时)。

我试过使用函数getTimeZoneOffset()的JS方法,但似乎不太推荐,因为它依赖于用户时间设置。 (我在我的机器上更改了时钟时间并尝试了)

因此,用户时间设置的任何更改都会改变时区偏移量。

我是否可以实施任何其他 'robust' 和 'trustworthy' 方法来获取时区偏移量,然后将其应用到我的 C# 代码中。

最佳。

这里有很多要放松的地方,所以我会逐点回答你的问题:

... I need to know exactly how to get the Timezone Offset for an active user ...

你无法得到时区偏移,你只能得到a 时区偏移量。也就是说,您获得的时区偏移量仅针对单个时间点。由于标准时间和夏令时的变化,时区经历 转换 。当您在 JavaScript Date 对象上调用 getTimeZoneOffset 时,该 Date 对象代表一个特定的时间点(默认情况下,"now")。因此,返回的偏移量是针对该特定时间点的。无法保证之前的时间点或未来的时间点将使用相同的偏移量。将偏移量发送到服务器仅在您将其与特定时间戳配对时才有用(例如使用 DateTimeOffset 模式记录活动)。

另请阅读 the timezone tag wiki 的 "Time Zone != Offset" 部分。

... to calculate his actual local time ...

你不需要计算那个。 new Date().toString() 将为您提供用户的实际当地时间。如果您需要特定格式的输出,您可以使用像 Luxon, Date-fns, Moment.js, and others, or you can use a function like this one.

这样的库

... (no need for DST).

人们经常这么说是因为他们认为它消除了复杂性,但事实是 - 这不取决于你 . DST 是否适用(以及何时适用)取决于管理相关特定时区的当地政府机构。如果夏令时适用于您的用户在相关时间的本地时间,并且您决定 考虑到这一点,那么您的结果将延迟一个小时(通常)。

幸运的是,所有辛苦的工作都已经为您完成了。许多人努力工作以确保 time zone databases 保持准确。消耗他们的努力比试图绕过他们更容易。

此外,即使您认为自己不关心夏令时,也要考虑到许多时区的转换是由 标准时间.

... getTimeZoneOffset() but it seems that it not very recommended because it is relying on the user Time Settings. ...

依赖于用户时间设置不是问题。不推荐的一般原因是因为 "Time Zone != Offset" 我已经描述过的问题。如果你想知道用户的时区,你需要一个像"America/Los_Angeles"这样的时区标识符,而不是480.

的偏移量

... So any change in the user time settings will alter the timezone offset.

用户可以控制自己的计算机,可以将时区设置为任何他们想要的。通常人们将时区设置为当地时间,以便他们看到的时钟是正确的。人们使用其他时区并非闻所未闻,例如如果他们在海外工作并希望将他们的工作日与母公司的当地时间对齐(尽管我个人认为这令人厌恶)。无论如何,这不是您可以合理期望控制的东西。

... Are there any other 'robust' and 'trustworthy' methods that can I implement to get the timezone offset and then apply it inside my C# code.

如果你想要用户的本地时区,那么use one of the methods listed here

但是,我不确定您考虑的标准是什么 "robust and trustworthy"。上述方法没有什么特别不值得信任的...

您可能要考虑的一件事是,如果您实际上不需要用户的 本地时区,而是特定位置的本地时间。虽然这些看起来像是同一件事,但并非总是如此。您可以使用 one of the methods listed here.

导出位置的本地时区标识符