时区信息 浪漫标准时间需要前一小时模棱两可

本文关键字:一小时 模棱两可 标准时间 信息 时区 | 更新日期: 2023-09-27 18:16:11

我正在尝试在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:假
是否模棱两可:真实

我可能错过了一些东西。我希望 dst 是真的,模棱两可是假的,但事实恰恰相反。

很难保持概述,但为什么我会看到这种行为?

时区信息 浪漫标准时间需要前一小时模棱两可

您应该阅读这篇博客文章,其中详细介绍了时区选择和"自动调整..."如何影响Windows注册表设置。复选框。 它还介绍了TimeZoneInfo如何使用这些设置。 具体来说,它指出:

当本地时区禁用夏令时时,TimeZoneInfo.Local将返回一个TimeZoneInfo.SupportsDaylightSavingTime设置为 False 的 TimeZoneInfo 对象。 使用此TimeZoneInfo实例的任何TimeZoneInfo.ConvertTime(...)调用都不会考虑夏令时。

恕我直言,永远没有充分的理由清除该复选框并禁用 DST。 它将计算机的时钟置于人工现实中。

如果在服务器上运行代码,则可能应将服务器的时区设置为 UTC。 这将使Windows不必为过渡更新计算机的BIOS,并允许来自其他服务器的本地时间戳全部排列。

关于您的代码,请注意DateTime.Now的结果具有.Kind == DateTimeKind.Local,并且与您之前使用的时区无关。 您碰巧报告了本地时区,但如果您使用其他时区,则代码将不正确。

获取调整规则

时,假设本地时区将有一个调整规则。 有些(如亚利桑那州(没有任何 DST,因此它们没有调整规则,并且您会得到一个索引越界异常(因为[0](。

另外,只是吹毛求疵,但是,

// This line is self redundant.
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id);
// It can be reduced to:
TimeZoneInfo tzi = TimeZoneInfo.Local;

但真正的问题是,由于您关闭了"调整 DST"选项,因此 DateTime 没有转换为正确的 UTC 时刻,以便确定它是否模棱两可。 如果您钻取 .Net 源代码(反编译或符号源(进行DateTime.IsAmbiguousTime(),您会发现它使用 TimeZoneInfo.ConvertTime() ,当取消选中该框时,它(根据前面的引用(不考虑 DST,从而使结果不正确(基本上关闭 1 小时(。

您还应该查看 MSDN 的注释TimeZoneInfo.IsAmbiguousTime,其中描述了输入的Kind如何影响输出结果。