【问题标题】:How do I get the result of javascript new Date().getTimezoneOffset() transferred to C# backend?如何将 javascript new Date().getTimezoneOffset() 的结果转移到 C# 后端?
【发布时间】:2020-08-03 15:16:57
【问题描述】:

查看标题:对于我正在研究的解决方案,我需要获取当前时区偏移量(从客户端,运行 javascript/jQuery)并在后端 C# 代码中使用它。 这个问题与here 提出的问题非常相似,但有一些不同之处——主要是我很确定客户端计算机上的时间不会被篡改。所以 new Date().getTimezoneOffset() 就可以了。

提交表单时我无法读取值,因为用户没有在表单中工作:用户登录后,屏幕上可见的项目中有一个表格,其中包含用户或其他人输入的数据用户。此数据包含必须根据客户的时区调整的 UTC 日期时间。 C# 代码负责检索和格式化数据——这就是我的问题。

将值存储在某处就足够了,以便 C# 可以在必要时读取它。但我不认为这也可以做到。这里的方法是什么?

提前致谢!

【问题讨论】:

  • 我遇到的大多数网站通常只允许您在个人资料首选项中选择一个时区。我想您可以使用该信息对您的服务器进行 AJAX POST 调用,并将其与会话数据一起存储。
  • 如果我理解这一点,您可以使用 new Date().getTimezoneOffset() 在客户端进行转换,因为这只是在客户端的时区显示时间的问题
  • @Alwaysa Learner - 是的,我可以这样做,但是:如何让 C# 访问这个值?
  • 我仍然无法理解为什么后端必须知道这个值。但是,如果您喜欢这样做,我唯一能想到的就是将每个用户的时区存储在用户表中,并在用户从不同时区登录时更新它。

标签: javascript c# jquery timezone-offset


【解决方案1】:

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

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

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

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

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

      Intl.DateTimeFormat().resolvedOptions().timeZone
      
    • 如果您需要支持旧版网络浏览器,您可以使用jsTimeZoneDetect,或moment.tz.guess() from 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")。您可以使用我的TimeZoneConverter 库中的TZConvert.GetTimeZoneInfo

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

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

【讨论】:

  • 谢谢马特,我会接受你在上一段中的建议。
  • 如果可能的话,另一个选项是将 UTC 值发送到浏览器并在那里进行转换。当您不必担心识别时区时,UTC 到本地时间要容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 2019-01-15
  • 2011-10-22
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
相关资源
最近更新 更多