4

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

4

3 回答 3

3

我不确定 ASP 的最新发展,但2006 年的这篇文章提供了一个有趣的答案:

问题是时区信息不能直接通过网络浏览器获得。您可以使用启发式方法来确定正确的时区,或者您必须根据用户的选择来存储用户的时区设置。

.Net 3.5 及其TimeZoneInfo..ConvertTime方法可能不需要以下内容,但为了完整起见:

一旦你有了时区设置,你现在需要翻译时间。您应该始终将您的日期/时间值存储在 UTC 中的数据库中。这消除了许多转换问题。如果您将信息存储在 UTC 中,那么当您向用户显示数据时,您只需要从 UTC 转换为用户的本地时区,并且当您从他们那里获取日期/时间值时,您需要从他们的时区转换为 UTC。

使这变得更加困难的是 TimeZone 类并不是那么有用。幸运的是,在 v2.0 中,更新了 DateTime 以支持时间是否为 UTC 的指示符。 您可以使用 DateTime.ToUniversalTime 方法将 DateTime 转换为 UTC。不幸的是,您无法将其转换回来

ToLocalTime方法使用本地时区,当在服务器上运行时,使用服务器的时区,这不是您想要的。然而更糟糕的是,您不能简单地创建一个 TimeZone 对象并使用它,因为该支持不存在。

Michael Brumm 创建了一个不错的小类,可以轻松创建和使用时区。我个人在自己的应用程序中使用了该代码的大量修改版本,它运行良好。以下是将 DB UTC 值转换为本地用户时区的步骤。

1) 为用户获取存储的时区值
2) 创建一个 SimpleTimeZone 类来包装它(使用一些将 DB 值映射到底层 Windows 注册表版本的映射方案)
3) 使用 SimpleTimeZone.ToLocalTime 方法将 DateTime 值转换为当地时间。

出于性能原因,您可能应该获取并初始化 SimpleTimeZone 实例,并将其缓存在 Items 属性中以保持请求的长度,这样您就不必继续创建它。

要从用户的本地时区转换为 UTC,请执行相反的操作:

1) 从用户那里获取存储的时区值
2) 创建一个 SimpleTimeZone 类来包装它
3) 使用 SimpleTimeZone.ToUniversalTime 方法将 DateTime 转换为 UTC。

于 2008-11-19T06:43:20.957 回答
1

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

于 2008-11-19T06:36:38.240 回答
1

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

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

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

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

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

另请参阅:反对 DateTime.Now 的案例

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

您还可以考虑使用Noda Time,它提供了IANA 时区数据库的实现,并且通常是一个更好的 API。

于 2014-07-10T17:59:34.667 回答