有没有办法在ASP.NET中为应用程序定义时区,以便隐式转换从当前服务器时间读取/与当前服务器时间相比的所有时间,或者我是否需要将转换语句作为每个DateTime.Now放入调用
答案 0 :(得分:3)
我不确定ASP的最新进展,但这个article from 2006提供了一个有趣的答案:
问题是时区信息无法通过网络浏览器直接获取。您可以使用启发式方法来确定正确的时区,或者您必须根据用户的选择存储时区设置。
.Net 3.5及其TimeZoneInfo..ConvertTime方法可能不需要以下内容,但为了完整起见,仍然需要:
获得时区设置后,您需要翻译时间。 您应始终将日期/时间值存储在数据库中,以UTC格式。这消除了许多转换问题。如果您以UTC格式存储信息,那么当您向他们显示数据时,您只需要将UTC从UTC转换为用户的本地时区,并且当您从中获取日期/时间值时需要将其时区转换为UTC。
使这更加困难的原因是TimeZone类并不是那么有用。幸运的是,在v2.0中,DateTime已更新,以支持时间是否为UTC的指示符。 您可以使用DateTime.ToUniversalTime方法将DateTime转换为UTC。不幸的是,你无法将其转换回来。
ToLocalTime方法使用本地时区,当在服务器上运行时,使用服务器的时区,这不是您想要的。更糟糕的是,您不能简单地创建TimeZone对象并使用它,因为该支持不存在。
Michael Brumm创造了一个很好的little class,因为它能够轻松创建和使用时区。我个人在我自己的应用程序中使用了该代码的大量修改版本,它运行良好。以下是将数据库UTC值转换为本地用户时区的步骤。
1)获取用户的存储时区值
2)创建一个SimpleTimeZone类来包装它(使用一些将DB值映射到底层Windows注册表版本的映射方案)
3)使用SimpleTimeZone.ToLocalTime方法将DateTime值转换为本地时间。
出于性能原因,您应该获取并初始化SimpleTimeZone实例并将其缓存在Items属性中以获取请求的长度,这样您就不必继续创建它。
要从用户的本地时区转换为UTC,请执行相反的操作:
1)从用户获取存储的时区值
2)创建一个SimpleTimeZone类来包装它
3)使用SimpleTimeZone.ToUniversalTime方法将DateTime转换为UTC。
答案 1 :(得分:1)
内部使用DateTime.UtcNow。对于.NET 3.5,请查看 TimeZoneInfo.ConvertTime
答案 2 :(得分:1)
请允许我直接回答这个问题。。
有没有办法在ASP.NET中定义应用程序的时区,以便隐式转换从当前服务器时间读取/与当前服务器时间相比的所有时间......
不,这是不可能的。 .NET中没有任何机制可以在每个线程或每个应用程序的基础上更改本地时区。它只能通过运行代码的机器的时区设置在系统范围内进行更改。 See this answer also
...或者我是否需要将转换语句作为每个DateTime.Now调用?
您不应该在Web应用程序中使用DateTime.Now
。由于可以轻松更改服务器的时区设置,因此应将应用程序设计为忽略它。这意味着在读取当前系统时间时使用DateTime.UtcNow
。或者,您可以将DateTimeOffset
与DateTimeOffset.Now
或DateTimeOffset.UtcNow
属性一起使用。
另请参阅:The Case Against DateTime.Now
如果您需要使用特定用户的当地时间,那么是 - 您必须为每次使用都进行转换。您可以使用TimeZoneInfo
类来完成此任务。
您也可以考虑使用Noda Time,它提供了IANA time zone database的实现,并且通常是一个更好的API。