我想在不使用注册表或更改操作系统时区的情况下更改.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的引用更改为其他东西,这是我希望首先避免的
答案 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}})。