时间更改为夏令时期间出现 DateTime 错误

DateTime error during time change to daylight saving time

我必须随着时间的推移绘制一个数据集,这是我从一个短数组计算出来的。这行得通,但是在转换为正确的时区时会引发异常:

System.ArgumentException: "提供的DateTime表示无效时间,例如时钟向前调整时,跳过的时间段内的任何时间都是无效的。参数名称:dateTime"

问题是数据集是在时移到夏令时期间记录的,因此凌晨 2 点和凌晨 3 点之间存在间隙。从凌晨 2 点开始,时间无效,因为它们根本不存在。但是当我尝试包含一个 if 语句来证明无效时间时它无济于事,因为布尔“isvalid”始终为假。我不明白为什么 bool 保持假,虽然几行之后它抛出一个异常,这个 DateTime 是无效的,那么我该怎么办?感谢您的帮助!

附加信息:date_0 的 KindLocal

DateTime date_0;             //equals {29.03.2020 02:00:00} which is invalid 
TimeZoneInfo tzf = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time");                       
bool isInvalid = tzf.IsInvalidTime(date_0);
if (isInvalid)
    {
          //do something (but this is never reached)
    }
DateTime dt = TimeZoneInfo.ConvertTime(date_0, tzf);   //here the exception is thrown
var isSum = tzf.IsDaylightSavingTime(dt);
if (isSum) date_0 = date_0.AddHours(1);

解决方案

感谢有用的评论。问题是 date_0 的 KindTimeZoneInfo tzf 不同。我通过将 tzf 更改为对应于 date_0 的 Local 来解决它。现在识别出无效的 DateTime,可以执行进一步的步骤。

TimeZoneInfo tzf = TimeZoneInfo.Local;
if(tzf.IsInvalidTime(date_0))
   {
         // ...
   } 

我假设您的 DateTimeKindUnspecified。来自联机文档 IsInvalidTime 然后会假定“dateTime 是 TimeZoneInfo 对象的时间并确定它是否无效”。

ConvertTime 说“假定为本地时间。将本地时间转换为 destinationTimeZone 中的时间。”

因此,如果您的本地时区与您的 TimeZoneInfo 不同,结果将令人惊讶。

如果您的 DateTime.Kind 是本地的,但您的 TimeZoneInfo 不是本地的,那么文档表明 IsInvalidTime 将 "Converts dateTime to the time of the TimeZoneInfo object and returns false ." 这就是 source code 的作用。总是 returns false 的函数有什么意义?

因为看起来您正在处理既不是本地也不是 UTC 的日期时间,您应该转换为 DateTimeOffset,或者将所有内容都转换为 UTC。

date_0 = DateTime.SpecifyKind(date_0, DateTimeKind.Unspecified);
if (tzf.IsInvalidTime(date_0)){
   // ...
}
var dto = new DateTimeOffset(date_0, tzf.GetUtcOffset(date_0));