不使用注册表更改.NET CLR时区

时间:2011-09-27 12:09:26

标签: .net timezone

我想在不使用注册表或更改操作系统时区的情况下更改.NET CLR的默认时区。有办法吗?

编辑: 看起来.NET CLR不支持默认时区与操作系统不同(与JVM不同)。

换句话说,我希望这句话能够返回我操作系统时区以外的其他内容:

TimeZoneInfo timeZoneInfo = TimeZoneInfo.Local;
Console.Out.WriteLine("timeZoneInfo = {0}", timeZoneInfo);

我想这样做的原因是使用我的用户(伦敦)的时区而不是我的机器(芝加哥)的时区来运行.NET GUI。

例如,您可以通过添加到命令行来更改Java运行时的时区:

-Duser.timezone="Europe/Berlin"

所以,例如,如果你想让DateTime.Now返回一个不同的时区,你不能不将所有对DateTime.Now的引用更改为其他东西,这是我希望首先避免的

2 个答案:

答案 0 :(得分:1)

您要求获得时区设置的不同结果,但我假设最后您有兴趣默认在另一个时区返回时间。

.NET框架支持UTC,本地,以及没有时区感的通用时间值。请参阅DateTimeKind枚举。

在处理时间值时,我通常在内部使用UTC,并在与用户交互时转换为特定区域。

因此,要回答您的问题,我知道在另一个时区返回本地时间的唯一方法是更改​​机器的时区。

开始说,为了获得理想的效果,您可以编写一个以UTC格式获取时间的实用程序类,然后使用配置参数存储要在返回之前应用的偏移量。

答案 1 :(得分:0)

您不应依靠CLR /框架为您提供时区信息,而应依赖外部信息源来处理时区。

我建议使用public info time zone database(也称为tz or Olson database)。虽然它没有声称具有100%的准确性,但我发现它对于我需要使用的任何东西都是准确的。

有一些.NET类可以解析这个数据库,即ZoneInfo (tz database / Olson database) .NET API。请注意,没有二进制发行版,您必须下载latest version并自行编译。

使用此库,您可以找到所需时区(它们在ZoneInfo个对象中表示),以查找您正在查找的区域,然后您可以为其DateTime执行各种功能在它上面(比如获得该日期的UTC偏移量,获取当前的当地时间,UTC时间等)。

请注意,这比.NET API IMO更准确,因为它要求您提供日期以获取时区信息;各个地区随着时间的推移已经改变了有关UTC偏移的规则,tz数据库和ZoneInfo API在表示历史记录和准确生成结果方面做得很好。

不要担心自2009年以来API没有任何变化;在撰写本文时,它目前正在解析最新数据分配中的所有文件(我实际上是在2011年9月25日对ftp://elsie.nci.nih.gov/pub/tzdata2011k.tar.gz文件运行的 - 在2017年3月,您将从{{{ 3}})。