我使用code
:
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
)德黑兰!
抱歉我的英语不好
答案 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,我确实不想转换它。
谢谢所有朋友。