我臭名昭著的夏令时有问题。

我有一个数据点列表,一年中每个小时一个。为了检查是否所有数据点都存在,我创建了一个时间迭代器,如下所示:

DateTime timeIterator = new DateTime(year, 1, 1, 0, 0, 0);


用它来迭代

timeIterator = timeIterator.AddHours(1);


并检查每次迭代是否在列表中存在时间点。

当涉及夏时制时,就会出现问题。在我的2014年示例中,时钟从3月30日的30点移动到0300。因此,在0159之后到0300。但是DateTime.AddHours()完全忽略了夏令时。如果timeIterator在{30.03.2014 01:00:00}并调用AddHours(1),则会得到{30.03.2014 02:00:00}这显然不存在。

如果现在对照此数据点测试列表,则(自然)不在列表中,并且抛出错误的“缺少数据点错误”。

如何检查我的DateTime是否为有效时间点?

提前致谢,
坦率

最佳答案

如何检查我的DateTime是否为有效时间点?


不要检查,确保它。您可以用UTC计算小时数,并将每个点转换为本地时间。

DateTimeOffset timeIterator = new DateTimeOffset(new DateTime(year, 1, 1, 0, 0, 0, DateTimeKind.Local));
timeIterator = timeIterator.AddHours(1);
timeIterator.LocalDateTime;

// assuming you have a TimeZoneInfo object, you can also get different local times:
TimeZoneInfo tzi = /* the timezone */;
TimeZoneInfo.ConvertTimeFromUtc(timeIterator.UtcDateTime, tzi);


但是,正如Damien_The_Unbeliever所评论的那样,这仅解决了一部分问题,该程序将不再检查是否存在无效日期。当您的数据以本地时间存储时,会出现另一个问题。这意味着从DST到正常时间的转换将连续两个小时,并且具有相同的本地DateTime表示形式。为了避免这种情况,数据必须与完整的信息(UTC或显式偏移)一起存储,以便以后进行比较。

编辑:

如果您的数据所在的时区具有有效的TimeZoneInfo对象,并且由于某种原因不想切换到DateTimeOffset,则还可以使用以下功能:

TimeZoneInfo tzi = /* the timezone */;
DateTime timeIterator = /* the time */;
if (tzi.IsAmbiguousTime(timeIterator))
{
    /* Expect multiple data entries */
}
if (tzi.IsInvalidTime(timeIterator))
{
    /* Expect no data entries */
}

关于c# - 夏令时和DateTime.AddHour(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41143598/

10-13 02:00
查看更多