13

C# 在时区之间转换时是否考虑夏令时?

我有一个伦敦当前时间的源日期,我想将其转换为我的时区 (CET)。这是我正在使用的代码。

DateTime time = DateTime.ParseExact(timeString, "HH:mm", null);
time = DateTime.SpecifyKind(time, DateTimeKind.Unspecified);

//Convert it to the right timezone. It is currently in GMT

TimeZoneInfo gmt = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
TimeZoneInfo current = TimeZoneInfo.Local;

DateTime utc = TimeZoneInfo.ConvertTimeToUtc(time, gmt);
DateTime local = TimeZoneInfo.ConvertTimeFromUtc(utc, core.startTime = local;

目前运行良好。然而,当 DST 抬起丑陋的脑袋时,它会继续工作还是会严重崩溃?由于过去有很多问题,我对 TimeZones 有点警惕。

4

4 回答 4

3

简短的回答是“不是无处不在,也不是完美的”。


TimeZoneInfo.GetAdjustmentRules 将为您提供有关 DST 偏移量更改以及它们何时生效和失效的规则集合。

但是,您的用户仍然可以通过取消选中 Windows 控制面板日期和时间中的“自动调整夏令时”来解决问题。如果在 Windows 中关闭了 DST,那么您将获得一个空的调整规则集合。

如果您想自动应用调整规则,您必须使用已设置 DateTimeKind 的 DateTime 对象。如果 DST 关闭,这将在转换中得到遵守。

GMT 是格林威治皇家天文台的太阳时。英国人发明了从日期线偏移时区的整个业务,因为他们是第一个在全球范围内协调任何事情的人。在过去的平静日子里,他们拥有遍布全球的帆船海军,但没有无线电。订单滞后数周或数月,因此一致、精确的全球计时是唯一一个拥有比行星更大的参考系的人——皇家天文学家——发明的。

月球的潮汐力正在减缓地球的自转。需要大量的果汁才能让海水上下晃动,这不是魔法,它来自地球的旋转时刻。

此外,太阳轨道的持续时间也不是恒定的,所以我们不时有闰秒来同步日历与行星现实。另一方面,恒星时没有这种愚蠢,所以我们远离它。然后是相对论漂移。GPS 卫星移动得如此之快,以至于它们实际上必须补偿轻微的时间扭曲。

于 2012-07-03T11:28:18.500 回答
0

在 .NET 中处理 1987 年之前的日期时要小心。TimeZoneInfo 中您感兴趣的时区的默认 AdjustmentRules 可能不足以满足您的目的。在这里阅读更多:http: //blog.appliedis.com/2013/03/06/beware-daylight-saving-time-transitions-in-dot-net/

于 2013-03-12T14:03:26.580 回答
0

C# 在时区之间转换时是否考虑夏令时?

是的,假设您的计算机保持更新,因为时区信息有时会通过 Windows 更新进行更新。如果该国家/地区没有更改其 DST 时间段,即使没有 Windows 更新,它也应该仍然有效(最近发生在澳大利亚)

我有一个伦敦当前时间的源日期,我想将其转换为我的时区 (CET)

你是什​​么意思'源日期是伦敦的当前时间'?始终将您的日期存储为 UTC 并将它们“在最后一分钟”转换为所需的本地时间。

如果您想知道夏令时更改时会发生什么,那么您可以通过更改计算机上的时钟来测试这一点。

于 2012-07-03T12:22:09.487 回答
0

至少在.net 4.5 TimeZoneInfo 确实处理夏令时。

检查它的最简单方法是比较 BaseUtcOffset 和 GetUtcOffset

   var baseOffset = timeZoneInfo.BaseUtcOffset;
   var currentOffset = timeZoneInfo.GetUtcOffset(currentLocalTime);
   var isDst = currentOffset > baseOffset;
   var delta = currentOffset - baseOffset;

如果您只对调整 DST 的 DateTime 感兴趣,这比处理不需要的 AdjustmentRule 容易得多。

顺便说一句,GMT 已过时,取而代之的是 UTC。

于 2015-07-10T05:47:41.467 回答