应用偏移时表示的exeption UTC时间必须介于0到10,000之间。发生在某些电脑上

时间:2015-12-23 09:12:42

标签: c# utc

我使用code

在Windows应用商店应用中使用以下C#
birthDateTimePicker.Date = DateTime.Now;
if (birthDateTimePicker.Date == DateTime.MinValue)
{
    no_date_lable.Visibility = Visibility.Collapsed;
    birthDateTimePicker.Visibility = Visibility.Collapsed;
}

注意:此行birthDateTimePicker.Date = DateTime.Now;例如用户将被选中,或者它将来自服务器。

但我在这一行得到了一个例外:

  

if(dt_born_dt == DateTime.MinValue)

抛出异常的原因是什么:

  

应用偏移时表示的UTC时间必须介于   第0年和第10,000年。

我真的在三台计算机上测试了这个,我在其中一台计算机上出错!!!

我将系统的时区更改为(UTC-08:00)太平洋时间(美国和加拿大),并且根本没有得到此例外且代码正常运行!

我的问题是为什么在系统中发生了这个异常,它的时区是(UTC+03:30)德黑兰!

抱歉我的英语不好

enter image description here

2 个答案:

答案 0 :(得分:4)

所以你的控制dt_born_dt(请使用有意义的名称,如birthDateTimePicker,并认为生日不需要时间,而且肯定不会是第1年[有现在没有人〜2015年活着],或许使用可空类型)具有类型Date的{​​{1}}属性,从调试器显示的DateTimeOffset值可见。

现在此类型具有+3:30的隐式转换,因此如果您执行此操作:

DateTime

它会将birthDatePicker.Date = DateTime.MinValue; 种类DateTime.MinValue转换为UTC。这将抛出您显示的异常,因为您处于GMT +时区:它会从DateTimeKind.Unspecified中减去您的GMT偏移量,从而产生无效值,如Converting DateTime.MinValue to DateTimeOffset中所述。

解决方案:使用DateTimeOffset.MinValue

另外,请勿在{{1​​}}周围使用MinValue;使用try-catch

答案 1 :(得分:1)

@CodeCaster答案非常完整且乐于助人。但是,解决此问题的另一种方法是转换" DateTime.MinValue"到 UTC

if (birthDateTimePicker.Date == DateTime.MinValue.ToUniversalTime())

我不得不使用这种方法因为" birthDateTimePicker.Date"我的数据库中的类型是DateTime而不是DateTimeOffset,我确实不想转换它。

谢谢所有朋友。