问题描述
我正在获取Eastern Standard Time
(TimeZoneInfo.AdjustmentRule
)的调整规则。
我可以TimeZoneInfo.AdjustmentRule.DaylightDelta
知道正在更改的小时或分钟,但是我找不到任何方法可以知道时间是按增量小时倒退还是向前移动。
因此,基本上,我试图确定是必须增加小时还是减少小时。
我知道有一个属性TimeZoneInfo.IsInvalidTime
,但在我看来,这不是最好先添加小时检查是否无效然后再减去再检查现在是否有效的最佳方法。
有没有更好,更直接的方式来了解这一点?
解决方法
DaylightDelta
属性是添加到标准偏移量中的时间,以获取规则适用的时段中的日光偏移量。在大多数情况下,这将是1小时,但也有例外,因此请不要对其进行硬编码。
例如,在美国东部时区(在Windows上使用"Eastern Standard Time"
标识符,在其他操作系统上使用"America/New_York"
标识符),当前的标准时间与UTC的偏移量是-5,而当前的标准时间偏移量是夏令时偏移为-4。
-5 + 1 = -4
也就是说,您可能不应该采用在问题中描述的方法。在大多数情况下,您将不需要自己访问调整规则。只需在TimeZoneInfo
上使用the conversion methods,例如TimeZoneInfo.ConvertTime
(及其他)。
一个主要的支持原因是,每个调整规则中都有一个名为_baseUtcOffsetDelta
的附加字段,未在公共API界面中公开。转换方法已将其考虑在内,但是因为它没有公开,所以您不能不借助反射就自己应用它。 (该字段用于当时区的标准时间偏移量发生历史更改时出现的边缘情况。)
如果您仍然决定自己使用调整规则,请记住调整DST的日期时间与将日期时间提前一段持续时间之间存在巨大差异。两者都是加法执行的,但是一个考虑了DateTimeKind
和/或偏移量,而另一个则没有考虑。如果不是很谨慎的话,最终可能会代表与您预期不同的时间点。
同样,在绝大多数用例中-您不需要自己使用调整规则。即使您需要更改模糊/无效时间处理的行为,也应采用与我描述的方法in this other answer类似的方法(使用此处发布的ToDateTimeOffset
扩展方法)。
最后-如果在使用案例中发现很难使用TimeZoneInfo
,则应该考虑使用Noda Time。其API更为冗长,但这可能会指导您获得更好的结果。