即使在过去的24小时内,我也不是第一次提出这个话题,但是令我感到惊讶的是,我还没有找到解决这个问题的清晰/最佳实践的解决方案。这个问题似乎也与我认为毫无保留地将所有日期保存在UTC中的决定相矛盾。我将尝试在此处说明问题:
给出两个DateTime对象,在考虑夏令时的情况下找到它们之间的持续时间。
请考虑以下情形:
-
UtcDate-LocalDate,其中LocalDate比a早1毫秒 DST切换。
-
LocalDateA-LocalDateB,其中LocalDateB为1 比DST切换时间早一毫秒。
UtcDate-LocalDate.ToUtc()提供的持续时间不考虑DST开关。 LocalDateA.ToUtc()-LocalDateB.ToUtc()是正确的,但是LocalDateA-LocalDateB也忽略了DST。
现在,显然有 个解决方案。我现在使用的解决方案是这种扩展方法:
public static TimeSpan Subtract(this DateTime minuend,TimeZoneInfo minuendTimeZone,DateTime subtrahend,TimeZoneInfo subtrahendTimeZone)
{
return TimeZoneInfo.ConvertTimeToUtc(DateTime.SpecifyKind(minuend,DateTimeKind.Unspecified),minuendTimeZone)
.Subtract(TimeZoneInfo.ConvertTimeToUtc(DateTime.SpecifyKind(subtrahend,subtrahendTimeZone));
}
它有效,我想。但是我有一些问题:
-
如果在保存日期之前将所有日期都转换为UTC,则此日期 方法将无济于事。时区信息(以及 DST)丢失。我已经习惯于始终将日期保存为UTC,是 DST的问题还不足以使它变得糟糕 决定吗?
-
不太可能有人会意识到这种方法,甚至 考虑这个问题时,计算之间的差异 日期。有更安全的解决方案吗?
-
如果我们一起努力,也许科技行业可以说服 大会废除了夏令时。