我有一个 ASP.NET MVC 5 应用程序,需要根据登录的用户位置显示特定时区中的所有 datetimeoffset 值。
有没有办法为整个应用程序设置文化,例如加载时的
en-us
,en-GB
,en-AU
等,并根据文化设置的时区显示所有datetimeoffset值?
提前致谢!
不,因为文化和时区是正交的概念。例如,我可能是来自纽约的说英语的人,但我可能正在日本访问或工作。如果我希望我的时钟代表当地时间,我会将计算机的时区设置为
Asia/Tokyo
(Mac/Linux) 或 Japan Standard Time
(Windows),即使我的文化设置仍然是 en-US
。
换句话说,虽然 .NET 确实有办法为应用程序全局设置 culture(即
CultureInfo.CurrentCulture
),但时区不是文化数据的一部分。
从最新的 .NET 8 开始,没有全局设置 time zone 的机制 - 至少对于从
DateTime.Now
、DateTimeOffset.Now
和 TimeZoneInfo.Local
返回的值没有。
但是,.NET 8 引入了
TimeProvider
类,您可以在此处阅读。使用此处显示的示例,您可以为自己创建一个 ZonedTimeProvider
并设置特定时区。然后在您的应用程序中,当获取当前时间时,请从提供者处获取。好处是您可以在运行单元测试时或在不同时区的应用程序中运行时替换不同的提供程序。
当然,总有传统的方法:获取 UTC 时间,并根据需要使用
TimeZoneInfo.ConvertTime
将其转换为特定时区。