为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 javascript new Date().getTimezoneOffset()

如何将 javascript new Date().getTimezoneOffset()

繁星coding 2022-12-18 16:17:50
请参阅标题:对于我正在处理的解决方案,我需要获取当前时区偏移量(从客户端,运行 javascript/jQuery)并在后端 C# 代码中使用它。这个问题与此处提出的问题非常相似,但存在一些差异 - 主要差异是我非常确定客户端计算机上的时间不会被篡改。所以new Date().getTimezoneOffset()就可以了。我无法在提交表单时读取值,因为用户不在表单中工作:用户登录后,在屏幕上可见的项目中有一个表格,其中包含用户或其他用户输入的数据。此数据包含必须根据客户端时区进行调整的 UTC 日期时间。C# 代码负责检索和格式化数据——因此我的问题。将值存储在某处就足够了,以便 C# 可以在必要时读取它。但我不认为这也可以做到。这里的方法是什么?提前致谢!
查看完整描述

1 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

您建议的方法存在缺陷,因为客户端浏览器的当前偏移量仅适用于当前日期和时间。实际上,时区偏移量在给定时区内随时间变化。您不能仅从一个时间点获取单一偏移量并期望使用它来将其他日期和时间转换为同一时区。相反,您需要使用标识时区的字符串,而不是该时区的偏移量。

例如,考虑美国的东部时区。在一年中的部分时间,它使用 UTC-5,我们称之为东部标准时间 (EST)。在一年中的其他时间,它使用 UTC-4,我们称之为东部夏令时 (EDT)。这个时区由 IANA time zone ID"America/New_York"或 Windows time zone ID 标识"Eastern Standard Time"(涵盖整个区域,包括 EST 和 EDT,尽管它的措辞)。

所以,把这个问题分解成几个步骤:

  1. 在 JavaScript 中,识别用户的 IANA 时区 ( America/New_York):

    • 如果你的目标是现代网络浏览器,你可以调用这个函数:

      Intl.DateTimeFormat().resolvedOptions().timeZone
    • 如果你需要支持旧的网络浏览器,你可以使用jsTimeZoneDetect,或者moment.tz.guess()来自Moment-Timezone

  2. 通过您喜欢的任何机制(表单发布、XHR、获取等)将该字符串发送到您的网络服务器

  3. 在您的 .NET 代码中,接收该字符串并使用它来引用时区并进行转换。你有两个选择:

    • 您可以使用Noda Time,将 IANA 时区 ID 传递给DateTimeZoneProviders.Tzdb主页示例中所示。

    • 您可以使用 .NET 的内置TimeZoneInfo对象。如果您在非 Windows 系统(Linux、OSX 等)上运行 .NET Core,您只需将 IANA 时区 ID 传递给TimeZoneInfo.FindSystemTimeZoneById. 如果您使用的是 Windows,则需要先将其转换为 Windows 时区 ID ( "Eastern Standard Time")。您可以使用TZConvert.GetTimeZoneInfo我的TimeZoneConverter库。

  4. 一旦您拥有DateTimeZoneNoda Time 或TimeZoneInfo对象,您就可以使用其上的方法将 UTC 值转换为该时区的本地时间值。这些中的每一个都将为转换的时间点应用正确的偏移量。

我还要说,许多应用程序只是要求用户从下拉列表中选择他们的时区并将其保存在用户配置文件中。只要您存储的是时区标识符字符串而不仅仅是数字偏移量,这种方法完全可以用来替换上面的步骤 1 和 2。


查看完整回答
反对 回复 2022-12-18
  • 1 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信