TimeZoneInfo是否考虑了DST?

在时区之间进行转换时,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有点警惕。

TimeZoneInfo.GetAdjustmentRules将为您提供有关DST偏移变化以及它们何时进入和失效的规则的集合。

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

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

GMT是格林威治皇家天文台的太阳时报。 英国人从日期线发明了时区偏移的全部业务,因为他们是第一个在全球范围内协调任何事情的人。 在昔日的寂静日子里,他们拥有一支全行星的海军帆船而没有收音机。 订单滞后数周或数月,因此唯一一个具有比行星更大的参考框架的人 – 皇家天文学家 – 发明了一致,精确的全球时间保持。

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

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

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

是的,假设您的计算机保持更新,因为有时会使用Windows更新更新时区信息。 如果该国家没有改变他们的夏令时期间(这最近发生在澳大利亚),即使没有Windows更新它仍应该工作

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

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

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

在.NET中使用1987年以前的日期时要小心。 TimeZoneInfo中您感兴趣的时区的默认调整规则可能不足以满足您的需要。 点击此处了解更多信息: http : //blog.appliedis.com/2013/03/06/beware-daylight-saving-time-transitions-in-dot-net/

至少在.net 4.5中,TimeZoneInfo可以处理夏令时。

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

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

这比处理adjustRule容易得多,如果您只想调整DST的DateTime,则不需要。

顺便说一句GMT已经过时,被UTC取代。