2008-11-19 76 views

回答

3

我不知道有关ASP的最新演变,但这article from 2006提供了一个有趣的答案:

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

接下来可能无法与.net 3.5及其TimeZoneInfo..ConvertTime方法需要,不过,出于完整性的缘故:

一旦你有,你现在需要的时间翻译时区设置。 您应该始终使用UTC将日期/时间值存储在数据库中。这消除了许多转换问题。如果以UTC格式存储信息,那么只需将UTC显示到用户的本地时区,然后将数据显示给它们时,如果从中获取日期/时间值,则需要将时区转换为UTC。

是什么使这更困难的是,TimeZone类是不是所有的有用。幸运的是,在v2.0中,DateTime更新为支持时间是否为UTC的指标。 您可以使用DateTime.ToUniversalTime方法将DateTime转换为UTC。不幸的是,您不能将其转换回

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

迈克尔·布拉姆为了能够轻松地创建和使用时区创造了一个很好的little class。我个人在我自己的应用程序中使用了该代码的重大修改版本,并且效果很好。以下是将DB UTC值转换为本地用户时区的步骤。

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

出于性能方面的考虑,您或许应该得到和初始化的SimpleTimeZone实例,并将它缓存在项目属性为请求的长度,这样你就不必不断创建它。

从用户的本地时区转换为UTC做相反:

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

+0

感谢您的意见 - 我不希望显示为“用户时间”,只是从服务器的不同时间(静态)。无论如何,这仍然回答我的问题 – 2008-11-19 06:50:30

1

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

有没有一种方法来定义时区在ASP.NET应用程序使得从读/相比,目前的服务器时间隐式转换始终...

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

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

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

参见:The Case Against DateTime.Now

当你需要与特定用户的本地时间来工作,然后是 - 你必须投入转化为每个使用。您可以使用TimeZoneInfo类完成此操作。

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

相关问题