【发布时间】:2013-05-26 04:05:05
【问题描述】:
我试图在 C# 应用程序中控制夏令时,而不是让 Windows 来做。 (这里的原因我就不说了)。
所以我在日期和时间设置(Windows7)中删除了“自动调整时钟以进行夏令时”的复选标记
我写了一小段代码来演示我面临的问题。
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id);
// "Romance Standard Time"
var rule = tzi.GetAdjustmentRules()[0];
System.Globalization.CultureInfo.CurrentCulture.ClearCachedData();
var timestampToWorkOn = DateTime.Now;
Console.WriteLine("Timezone is: " + tzi.ToString());
Console.WriteLine("Timezone id is: " + tzi.Id);
Console.WriteLine("Timestamp right now: " + timestampToWorkOn.ToString("yyyy-MM-dd HH:mm"));
Console.WriteLine("Rule for change says: " + rule.DaylightTransitionEnd.TimeOfDay.ToString("HH:mm"));
Console.WriteLine("Is it dst: " + tzi.IsDaylightSavingTime(timestampToWorkOn));
Console.WriteLine("Is it ambiguous:" + tzi.IsAmbiguousTime(timestampToWorkOn));
由于从 dst 到正常时间的转换应该发生在 3:00,我怀疑从 2:00 到 3:00 的时间会不明确。 但是在 1:54 运行代码的结果是:
时区为:(UTC+01:00) 布鲁塞尔、哥本哈根、马德里、巴黎
时区 ID 为:浪漫标准时间
现在的时间戳:2013-10-27 01:54
更改规则说:03:00
是 dst: False
是不是模棱两可:是的
我可能遗漏了什么。 我希望 dst 是真的,而模棱两可是假的,但事实恰恰相反。
很难保持概览,但为什么我会看到这种行为?
【问题讨论】:
-
选择夏令时更改的确切日期无疑是问题的一部分。加上“我自己做”的角度和 UTC+1 偏移量,可以任意增加一个小时的问题。只在 UTC 工作,让痛苦停止。
-
但目标是控制windows的时间。包括 dst 转换。如果我想在纯 utc 中工作,并且想要达到控制时间转换的目标,我需要有一个包含所有时区所有规则的数据库......并维护它。我想我可能想仔细看看野田时间。 ....
-
您是否尝试创建 Iversen 标准时间?这实际上是可能的,TimeZoneInfo.CreateCustomTimeZone()。说服其他程序使用它很可能是个问题。
-
我不是。基本上是因为它需要控制带有增强型写入文件管理器的 Windows 嵌入式 pc 驱动器。所以没有任何东西被提交到 c 驱动器,因此每次转换后 windows 启动时,它认为它需要调整时间。一次又一次。最终结果是每次启动 pc 时时间会偏移一小时。所以我必须自己控制它并将当前的dst状态存储到d:驱动器
-
我不得不说,一百年后我都不会猜到这是您要解决的实际问题。修补 TimeZoneInfo 永远不会让您接近解决方案。在 superuser.com 上提问,解释您要解决的真正问题。