我必须绘制一个随时间变化的数据集,这是我从一个短数组中计算出来的。这是可行的,但是当涉及到转换到正确的时区时,它会抛出异常:
System.ArgumentException:“提供的 DateTime 表示无效时间。例如,当时钟向前调整时,跳过的周期内的任何时间都是无效的。参数名称:dateTime”
问题是数据集是在夏令时转换期间记录的,因此凌晨 2 点到 3 点之间存在间隙。从凌晨 2 点开始,时间就无效了,因为它们根本不存在。但是,当我尝试包含 if 语句来证明无效时间时,它没有帮助,因为 bool“isvalid”始终为 false。我不明白为什么 bool 保持 false,尽管几行后它抛出一个异常,表明该 DateTime 无效,所以我能做什么?感谢您的帮助!
其他信息:date_0 的种类
是本地
。
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 的 Kind
与 TimeZoneInfo
tzf 不同。我通过将 tzf 更改为与 date_0 相对应的 Local
解决了这个问题。现在,无效的 DateTime
已被识别,可以执行进一步的步骤。
TimeZoneInfo tzf = TimeZoneInfo.Local;
if(tzf.IsInvalidTime(date_0))
{
// ...
}
最佳答案
我假设您的DateTime
的Kind
为Unspecified
。来自在线文档
IsInvalidTime然后会假设“dateTime 是 TimeZoneInfo 对象的时间并确定它是否无效”。
而ConvertTime说“假定为本地时间。将本地时间转换为目的地时区中的时间。”
因此,如果您的本地时区与 TimeZoneInfo 不同,结果将会令人惊讶。
如果您的 DateTime.Kind
是本地的,但您的 TimeZoneInfo 不是本地的,则文档建议 IsInvalidTime 将“将 dateTime 转换为 TimeZoneInfo 对象的时间并返回 false。” 这就是source code做。总是返回 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));
关于c# - 时间更改为夏令时期间出现日期时间错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63167248/