【问题标题】:Is there a way to define the timezone for an application in ASP.NET?有没有办法在 ASP.NET 中为应用程序定义时区?
【发布时间】:2026-02-08 07:30:01
【问题描述】:

有没有办法在 ASP.NET 中为应用程序定义时区,以便从当前服务器时间读取/比较的所有时间都被隐式转换,或者我是否需要将转换语句作为每个 DateTime.Now打电话?

【问题讨论】:

    标签: asp.net time timezone


    【解决方案1】:

    我不确定 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。

    【讨论】:

    • 谢谢你 - 我不希望显示为“用户时间”,只是与服务器不同的时间(静态)。无论如何,这仍然回答了我的问题。
    【解决方案2】:

    内部使用DateTime.UtcNow。对于 .NET 3.5,请查看 TimeZoneInfo.ConvertTime.

    【讨论】:

      【解决方案3】:

      请允许我直接回答这个问题

      有没有办法在 ASP.NET 中为应用程序定义时区,以便从当前服务器时间读取/比较的所有时间都被隐式转换...

      不,这是不可能的。 .NET 中没有机制可以在每个线程或每个应用程序的基础上更改本地时区。它只能通过运行代码的机器的时区设置在系统范围内更改。 See this answer also.

      ...或者我是否需要在每个 DateTime.Now 调用中放入转换语句?

      您不应该在 Web 应用程序中使用 DateTime.Now。因为您的服务器的时区设置很容易更改,所以您应该将应用程序设计为忽略它。这意味着在读取当前系统时间时使用DateTime.UtcNow。或者,您可以使用 DateTimeOffset 及其 DateTimeOffset.NowDateTimeOffset.UtcNow 属性。

      另见:The Case Against DateTime.Now

      当您需要使用特定用户的本地时间时,可以 - 您必须为每次使用进行转换。您可以使用TimeZoneInfo 类来完成此操作。

      您也可以考虑使用Noda Time,它提供了IANA time zone database 的实现,总体上是一个更好的API。

      【讨论】:

        最近更新 更多