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,尽管它的措辞)。
所以,把这个问题分解成几个步骤:
在 JavaScript 中,识别用户的 IANA 时区 (
America/New_York
):如果你的目标是现代网络浏览器,你可以调用这个函数:
Intl.DateTimeFormat().resolvedOptions().timeZone
如果你需要支持旧的网络浏览器,你可以使用jsTimeZoneDetect,或者
moment.tz.guess()
来自Moment-Timezone。通过您喜欢的任何机制(表单发布、XHR、获取等)将该字符串发送到您的网络服务器
在您的 .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库。一旦您拥有
DateTimeZone
Noda Time 或TimeZoneInfo
对象,您就可以使用其上的方法将 UTC 值转换为该时区的本地时间值。这些中的每一个都将为转换的时间点应用正确的偏移量。
我还要说,许多应用程序只是要求用户从下拉列表中选择他们的时区并将其保存在用户配置文件中。只要您存储的是时区标识符字符串而不仅仅是数字偏移量,这种方法完全可以用来替换上面的步骤 1 和 2。
添加回答
举报