Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将时间更改为夏令时期间发生DateTime错误_C#_Winforms_Datetime_Timezone_Argumentexception - Fatal编程技术网

C# 将时间更改为夏令时期间发生DateTime错误

C# 将时间更改为夏令时期间发生DateTime错误,c#,winforms,datetime,timezone,argumentexception,C#,Winforms,Datetime,Timezone,Argumentexception,我必须绘制一个从短数组计算的数据集。这是可行的,但当转换到正确的时区时,会引发异常: System.ArgumentException:“提供的DateTime表示无效时间。例如,当时钟向前调整时,跳过的时段中的任何时间都无效。参数名称:DateTime” 问题是数据集是在夏时制转换期间记录的,因此在凌晨2点和3点之间存在间隔。从凌晨2点开始,时间无效,因为它们根本不存在。但是,当我试图包含一个if语句来证明无效时间时,它没有帮助,因为bool“isvalid”总是false。我不明白为什么bo

我必须绘制一个从短数组计算的数据集。这是可行的,但当转换到正确的时区时,会引发异常:

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

问题是数据集是在夏时制转换期间记录的,因此在凌晨2点和3点之间存在间隔。从凌晨2点开始,时间无效,因为它们根本不存在。但是,当我试图包含一个if语句来证明无效时间时,它没有帮助,因为bool“isvalid”总是false。我不明白为什么bool保持为false,尽管几行之后它抛出了一个异常,即这个日期时间无效,那么我能做什么呢?谢谢你的帮助

附加信息:日期0的
种类是
Local

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);
解决方案

谢谢你的宝贵意见。问题是日期0的种类与时区信息不同。我通过将tzf更改为与日期0相对应的
Local
,解决了这个问题。现在识别出无效的
DateTime
,可以执行进一步的步骤

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

我假设您的
DateTime
具有
类型的
未指定的
。从在线文档中
然后假设“dateTime是TimeZoneInfo对象的时间,并确定它是否无效”

而表示“假定为本地。将本地时间转换为destinationTimeZone中的时间。”

因此,如果您的本地时区与您的时区信息不一样,结果会令人惊讶

如果您的
DateTime.Kind
是本地的,但您的TimeZoneInfo不是本地的,那么文档建议IsInvalidTime将“将DateTime转换为TimeZoneInfo对象的时间并返回false”。这就是。一个总是返回false的函数有什么意义

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

date\u 0=DateTime.SpecifyKind(date\u 0,DateTimeKind.Unspecified);
如果(tzf.IsInvalidTime(日期0)){
// ...
}
var dto=新的日期时间偏移量(日期0,tzf.GetUtcOffset(日期0));

“如果dateTime无效,则为true;否则为false。”-因此您的
是有效的
变量被反转。它实际上应该是
isInValid
isvalid=!tzf.IsInvalidTime(日期0)另请参见日期0的类型?如果您不是专门处理UTC和本地时间,您可能应该使用
DateTimeOffset
@Fildor:您是对的。为了更好地使用,我更改了变量名understanding@JeremyLakeman:日期是本地的。谢谢这帮了大忙,我在原来的帖子中添加了一个解决方案。