TimeZoneInfo是否考虑了DST?

时间:2012-07-03 11:07:19

标签: c# timezone 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有点警惕。

4 个答案:

答案 0 :(得分:1)

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

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

如果要自动应用调整规则,则必须使用已设置DateTimeKind的DateTime对象。如果DST已关闭,则转化过程中将予以遵守。

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

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

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

答案 1 :(得分:0)

  

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

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

  

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

至少在.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取代。

相关问题