如何将 javascript new Date().getTimezoneOffset() 的结果传输到 C# 后端?
How do I get the result of javascript new Date().getTimezoneOffset() transferred to C# backend?
见标题:对于我正在处理的解决方案,我需要获取当前时区偏移量(来自客户端,运行 javascript/jQuery)并在后端 C# 代码中使用它。
这个问题与 提出的问题非常相似,但存在一些差异 - 主要差异是我非常确定客户端计算机上的时间不会被篡改。所以 new Date().getTimezoneOffset() 就可以了。
我无法在提交表单时读取值,因为用户不在表单中工作:用户登录后,在屏幕上可见的项目中有一个 table 输入了数据由用户或其他用户。此数据包含必须根据客户端时区进行调整的 UTC 日期时间。 C# 代码负责检索和格式化数据 - 因此我的问题。
将值存储在某处就足够了,以便 C# 可以在必要时读取它。但我不认为这也可以做到。这里的方法是什么?
提前致谢!
您建议的方法存在缺陷,因为客户端浏览器的 current 偏移量仅适用于 current 日期和时间.实际上,时区偏移量在给定时区内随时间变化。您不能仅从一个时间点获取单一偏移量并期望使用它来将其他日期和时间转换为同一时区。相反,您需要使用标识 时区 的字符串,而不是该时区的偏移量。
例如,考虑美国东部时区。在一年中的部分时间,它使用 UTC-5,我们称之为东部标准时间 (EST)。在一年中的其他时间,它使用 UTC-4,我们称之为东部夏令时 (EDT)。此时区由 IANA 时区 ID "America/New_York"
或 Windows 时区 ID "Eastern Standard Time"
标识(涵盖整个时区,包括 EST 和 EDT,尽管它的措辞)。
所以,把这个问题分解成几个步骤:
在JavaScript中,识别用户的IANA时区(America/New_York
):
如果你的目标是现代网络浏览器,你可以调用这个函数:
Intl.DateTimeFormat().resolvedOptions().timeZone
如果您需要支持较旧的网络浏览器,可以使用jsTimeZoneDetect, or moment.tz.guess()
from Moment-Timezone。
通过您喜欢的任何机制(表单 post、XHR、获取等)将该字符串发送到您的网络服务器
在您的 .NET 代码中,接收该字符串并使用它来引用时区并进行转换。您有两个选择:
您可以使用 Noda Time,将 IANA 时区 ID 传递给 DateTimeZoneProviders.Tzdb
,如主页上的示例所示。
您可以使用 .NET 的 built-in TimeZoneInfo
对象。如果您是 non-Windows 系统(Linux、OSX 等)上的 运行 .NET Core,您只需将 IANA 时区 ID 传递给 TimeZoneInfo.FindSystemTimeZoneById
.如果您使用 Windows,您需要先将其转换为 Windows 时区 ID ("Eastern Standard Time"
)。您可以使用我的 TimeZoneConverter 库中的 TZConvert.GetTimeZoneInfo
。
一旦您拥有来自 Noda Time 的 DateTimeZone
或 TimeZoneInfo
对象,您可以使用其上的方法将 UTC 值转换为本地时间值时区。这些中的每一个都将为转换的时间点应用正确的偏移量。
我还要说,许多应用程序只是要求用户从下拉列表中选择他们的时区并将其保存在用户配置文件中。只要您存储的是时区标识符字符串而不仅仅是数字偏移量,这种方法完全可以用来替换上面的步骤 1 和 2。
见标题:对于我正在处理的解决方案,我需要获取当前时区偏移量(来自客户端,运行 javascript/jQuery)并在后端 C# 代码中使用它。
这个问题与
我无法在提交表单时读取值,因为用户不在表单中工作:用户登录后,在屏幕上可见的项目中有一个 table 输入了数据由用户或其他用户。此数据包含必须根据客户端时区进行调整的 UTC 日期时间。 C# 代码负责检索和格式化数据 - 因此我的问题。
将值存储在某处就足够了,以便 C# 可以在必要时读取它。但我不认为这也可以做到。这里的方法是什么?
提前致谢!
您建议的方法存在缺陷,因为客户端浏览器的 current 偏移量仅适用于 current 日期和时间.实际上,时区偏移量在给定时区内随时间变化。您不能仅从一个时间点获取单一偏移量并期望使用它来将其他日期和时间转换为同一时区。相反,您需要使用标识 时区 的字符串,而不是该时区的偏移量。
例如,考虑美国东部时区。在一年中的部分时间,它使用 UTC-5,我们称之为东部标准时间 (EST)。在一年中的其他时间,它使用 UTC-4,我们称之为东部夏令时 (EDT)。此时区由 IANA 时区 ID "America/New_York"
或 Windows 时区 ID "Eastern Standard Time"
标识(涵盖整个时区,包括 EST 和 EDT,尽管它的措辞)。
所以,把这个问题分解成几个步骤:
在JavaScript中,识别用户的IANA时区(
America/New_York
):如果你的目标是现代网络浏览器,你可以调用这个函数:
Intl.DateTimeFormat().resolvedOptions().timeZone
如果您需要支持较旧的网络浏览器,可以使用jsTimeZoneDetect, or
moment.tz.guess()
from Moment-Timezone。
通过您喜欢的任何机制(表单 post、XHR、获取等)将该字符串发送到您的网络服务器
在您的 .NET 代码中,接收该字符串并使用它来引用时区并进行转换。您有两个选择:
您可以使用 Noda Time,将 IANA 时区 ID 传递给
DateTimeZoneProviders.Tzdb
,如主页上的示例所示。您可以使用 .NET 的 built-in
TimeZoneInfo
对象。如果您是 non-Windows 系统(Linux、OSX 等)上的 运行 .NET Core,您只需将 IANA 时区 ID 传递给TimeZoneInfo.FindSystemTimeZoneById
.如果您使用 Windows,您需要先将其转换为 Windows 时区 ID ("Eastern Standard Time"
)。您可以使用我的 TimeZoneConverter 库中的TZConvert.GetTimeZoneInfo
。
一旦您拥有来自 Noda Time 的
DateTimeZone
或TimeZoneInfo
对象,您可以使用其上的方法将 UTC 值转换为本地时间值时区。这些中的每一个都将为转换的时间点应用正确的偏移量。
我还要说,许多应用程序只是要求用户从下拉列表中选择他们的时区并将其保存在用户配置文件中。只要您存储的是时区标识符字符串而不仅仅是数字偏移量,这种方法完全可以用来替换上面的步骤 1 和 2。