c# - 时间更改为夏令时期间出现日期时间错误

标签 c# winforms datetime timezone argumentexception

我必须绘制一个随时间变化的数据集,这是我从一个短数组中计算出来的。这是可行的,但是当涉及到转换到正确的时区时,它会抛出异常:

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 的 KindTimeZoneInfo tzf 不同。我通过将 tzf 更改为与 date_0 相对应的 Local 解决了这个问题。现在,无效的 DateTime 已被识别,可以执行进一步的步骤。

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

最佳答案

我假设您的DateTimeKindUnspecified。来自在线文档 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/

相关文章:

c# - SaveCopyAs 方法不起作用

.NET CF 3.5 Forms 与仅同步网络设备对话

c# - 从 DataGridView 中删除行时出现意外行为

c# - 设置文化时,我可以覆盖日期格式吗?毫米/日/年?

c# - 使用 Type.GetMethod(string name, Type[] types) 的意外行为

c# - HttpListener 设置总连接超时

c# - 如何在 C# 中实现分段文本框,强制用户以特定格式输入值?

php - WordPress:按月分组的事件

java - 如何使用 DateTimeFormatter 解析带冒号的偏移量?

c# - 将类中的字符串添加到 List<string> 中的简写方法?