- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 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));
由于从夏令时到正常时间的过渡应该发生在 3:00,我怀疑从 2:00 到 3:00 的时间是不明确的。但是在 1:54 运行代码的结果是:
Timezone is: (UTC+01:00) Brussels, Copenhagen, Madrid, Paris
Timezone id is: Romance Standard Time
Timestamp right now: 2013-10-27 01:54
Rule for change says: 03:00
Is it dst: False
Is it ambiguous:True
我可能遗漏了什么。我希望 dst 为真而 ambiguous 为假,但事实恰恰相反。
很难保持概览,但为什么我会看到这种行为?
最佳答案
你应该阅读 this blog post ,其中详细描述了 Windows 注册表设置如何受时区选择和“自动调整...”复选框的影响。它还描述了 TimeZoneInfo
如何使用这些设置。具体来说,它指出:
When daylight saving time is disabled for the local time zone,
TimeZoneInfo.Local
will return a TimeZoneInfo object withTimeZoneInfo.SupportsDaylightSavingTime
set to False. AnyTimeZoneInfo.ConvertTime(...)
calls using thisTimeZoneInfo
instance will not take daylight saving time into account.
恕我直言,没有充分的理由清除该复选框并禁用夏令时。它将计算机的时钟置于人工现实中。
如果您在服务器上运行代码,您可能应该将服务器的时区设置为 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 时刻,以便确定它是否有歧义。如果您深入了解 DateTime.IsAmbiguousTime()
的 .Net 源代码(反编译或符号源),您会发现它使用了 TimeZoneInfo.ConvertTime()
,其中(根据较早的引述)在未选中该框时不考虑夏令时,因此导致结果不正确(基本上减少了 1 小时)。
您还应该查看 TimeZoneInfo.IsAmbiguousTime
的 MSDN 注释,它描述了输入的 Kind
如何影响输出结果。
关于c# - TimeZoneInfo 在浪漫标准时间需要前一小时不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16838568/
我们的服务器无法正确处理从 UTC 转换为本地时间的 C# DateTime 实例的夏令时。我们在英国,因此我们的服务器设置为“(UTC+00:00) 都柏林、爱丁堡、里斯本、伦敦”区域。 症状: D
我一直在使用 DateTime 和 TimeZoneInfo 类,我使用以下代码遇到了一个有趣的结果: var dstStart = new DateTime(2013, 3, 10, 2, 0, 0
我有一个将本地时间转换为 UTC 并将其存储在数据库中的应用程序。我在特定日期测试转换时遇到了这个问题 - 2015 年 11 月 1 日(夏令时结束的日期(时钟在到达凌晨 2 点时回到凌晨 1 点)
我希望 TimeZoneInfo.GetSystemTimeZones().Single(x => x.Id == anId) 总是给出相同的结果 TimeZoneInfo.FindSystemTim
任何人都可以帮助理解这一点。 Microsoft 3.5 中的 TimeZoneInfo 类告诉我以下 GMT 日期不是东部时区的夏令时,但它是。 // Get Eastern Timezone Ti
信息:使用.NET 4.0和VS 2012 嗨, 我即将对我自己的类进行单元测试,该类具有 TimeZoneInfo 类型的成员。但是,当我尝试在测试中考虑该成员时,它总是失败。 以下是一个简化的示例
TimeZoneInfo.StandardName 仅返回英文值,有没有办法根据设定的文化获取翻译后的名称? 谢谢。 最佳答案 TimeZoneInfo 从注册表中提取... HKEY_LOCAL_M
TimeZoneInfo.ConvertTimeFromUtc方法从注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
我使用 TimeZoneInfo.ConvertTime 方法将源时区转换为目标时区。这对我来说很好。我想知道,如果 Destination TimeZone 的 Daylight Savings 已
我知道我们可以使用 id 查找时区信息 TimeZoneInfo timeZone2 = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard T
我在使用 TimeZoneInfo 时遇到了问题。这可能只是理解 Microsoft 对 TimeZoneInfo 的想法的问题。 问题是如果我运行这些代码行: var tzi = TimeZoneI
我想弄清楚 System.TimeZoneInfo 是本地用户还是系统范围的设置?我一直在修改我的本地时区作为我登录的用户,但是在后台运行的服务作为记录时区的系统似乎不断记录旧时区。如果 TimeZo
我正在尝试在 C# 应用程序中控制夏令时,而不是让 Windows 执行此操作。 (我不会在这里讨论原因)。 所以我在日期和时间设置(Windows7)中删除了复选标记“为夏令时自动调整时钟” 我写了
我的 UI 层中有一些代码,应该采用 UTC 格式的 DateTime,并将其转换为本地日期时间: 在我的数据层中,我只是这样做: private DateTime ConvertToLocal(Da
我正在尝试使用 EWS API 从我正在编写的控制台程序访问 Exchange 服务器。我已经指定了我要连接的交换服务器的类型,但是当我尝试执行我拥有的代码时,它给了我 Error 1 The typ
是否有针对中欧的通用 TimeZoneInfo 将 CET 和 CEST 合二为一? 我有一个正在执行以下操作的应用: TimeZoneInfo tzi = TimeZoneInfo.FindSyst
我希望实现一个带有如下签名的函数: bool IsTimeZoneValid(string countryCode, DateTime localTime); 目的是确定该国家/地区是否具有本地时间有
我在序列化 TimeZoneInfo 对象时遇到了一些问题。我试图在 WCF 服务的数据协定中使用 TimeZoneInfo 变量,但序列化失败。所以我写了这段代码来测试序列化。这是我所做的:
我从 JavaScript 向 Controller 传递了用户客户端日期时间与 UTC 之间的偏移分钟数,使用 Date 对象上的 getTimezoneOffset 方法。现在我在服务器端有了这些
使用 .net 4.0 在 win 7 上运行 asp.net mvc 2 我有一个从表单接收 2 个 DateTime 对象的 Controller 操作方法。表单上的 UI 使用 jQueryUi
我是一名优秀的程序员,十分优秀!