【发布时间】:2026-02-08 07:30:01
【问题描述】:
有没有办法在 ASP.NET 中为应用程序定义时区,以便从当前服务器时间读取/比较的所有时间都被隐式转换,或者我是否需要将转换语句作为每个 DateTime.Now打电话?
【问题讨论】:
有没有办法在 ASP.NET 中为应用程序定义时区,以便从当前服务器时间读取/比较的所有时间都被隐式转换,或者我是否需要将转换语句作为每个 DateTime.Now打电话?
【问题讨论】:
我不确定 ASP 的最新发展,但这个 article from 2006 提供了一个有趣的答案:
问题是时区信息不能直接通过网络浏览器获得。您可以使用启发式方法来确定正确的时区,或者您必须根据用户的选择来存储用户的时区设置。
.Net 3.5 及其TimeZoneInfo..ConvertTime 方法可能不需要以下内容,但为了完整起见:
设置好时区后,您现在需要翻译时间。 您应该始终以 UTC 格式将日期/时间值存储在数据库中。这消除了许多转换问题。如果您将信息存储在 UTC 中,那么当您向用户显示数据时,您只需要从 UTC 转换为用户的本地时区,并且当您从他们那里获取日期/时间值时,您需要从他们的时区转换为 UTC。
使这变得更加困难的是 TimeZone 类并不是那么有用。幸运的是,在 v2.0 中,更新了 DateTime 以支持时间是否为 UTC 的指示符。 您可以使用 DateTime.ToUniversalTime 方法将 DateTime 转换为 UTC。不幸的是,您无法将其转换回来。
ToLocalTime 方法使用本地时区,当在服务器上运行时,使用的不是您想要的服务器时区。然而更糟糕的是,您不能简单地创建一个 TimeZone 对象并使用它,因为该支持不存在。
Michael Brumm 创建了一个不错的 little class,以便能够轻松创建和使用时区。我个人在自己的应用程序中使用了该代码的大量修改版本,它运行良好。以下是将 DB UTC 值转换为本地用户时区的步骤。
1) 获取存储的用户时区值
2) 创建一个 SimpleTimeZone 类来包装它(使用一些将 DB 值映射到底层 Windows 注册表版本的映射方案)
3) 使用 SimpleTimeZone.ToLocalTime 方法将 DateTime 值转换为本地时间。
出于性能原因,您可能应该获取并初始化 SimpleTimeZone 实例,并将其缓存在 Items 属性中以保持请求的长度,这样您就不必继续创建它。
要从用户的本地时区转换为 UTC,请执行相反的操作:
1) 从用户那里获取存储的时区值
2) 创建一个 SimpleTimeZone 类来包装它
3) 使用 SimpleTimeZone.ToUniversalTime 方法将 DateTime 转换为 UTC。
【讨论】:
内部使用DateTime.UtcNow。对于 .NET 3.5,请查看 TimeZoneInfo.ConvertTime.
【讨论】:
请允许我直接回答这个问题。
有没有办法在 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。
【讨论】: