C# 应用偏移时表示的exeption UTC时间必须介于0年和10000年之间。发生在某些计算机上
我使用C# 应用偏移时表示的exeption UTC时间必须介于0年和10000年之间。发生在某些计算机上,c#,utc,C#,Utc,我使用C在Windows应用商店应用程序中拥有以下code: 注意:此行birthDateTimePicker.Date=DateTime.Now是真正的用户将被选中或它将来自服务器 但我在这一行有一个例外: if(dt_born_dt==DateTime.MinValue) 引发异常的原因是什么: 应用偏移时表示的UTC时间必须介于 第0年和第10000年 真的,我在三台计算机上测试了这个,其中一台出现了错误 我将系统的时区更改为太平洋时间(美国和加拿大),但根本没有收到此异常,代码工作正常
C
在Windows应用商店应用程序中拥有以下code
:
注意:此行birthDateTimePicker.Date=DateTime.Now例如,代码>是真正的用户将被选中或它将来自服务器
但我在这一行有一个例外:
if(dt_born_dt==DateTime.MinValue)
引发异常的原因是什么:
应用偏移时表示的UTC时间必须介于
第0年和第10000年
真的,我在三台计算机上测试了这个,其中一台出现了错误
我将系统的时区更改为太平洋时间(美国和加拿大),但根本没有收到此异常,代码工作正常
我的问题是,为什么在时区为(UTC+03:30
)德黑兰的系统中发生此异常
对不起,我的英语很差
<你的控件<代码> dtyBrnntd(请使用有意义的名字,如<代码>生日DeMeTeMePixe>代码>,并考虑出生日期不需要时间,而且最肯定的不是1年(现在没有年龄2015岁的人),也许使用可空类型。具有类型为DateTimeOffset
的Date
属性,可以从调试器显示的+3:30
值中看到该属性
现在,此类型具有来自日期时间的隐式转换,因此如果执行此操作:
birthDatePicker.Date = DateTime.MinValue;
它将把DateTime.MinValue
转换为UTC,该值具有DateTimeKind.Unspecified
kind。这将引发您显示的异常,因为您处于GMT+时区:它将从MinValue
中减去您的GMT偏移量,产生一个无效值,如中所述
解决方法:使用
另外,不要在Parse(Exact)
周围使用try-catch
;使用TryParse(精确)
@CodeCaster的答案非常完整,非常有用。但是,解决此问题的另一种方法是将“DateTime.MinValue”转换为UTC
if (birthDateTimePicker.Date == DateTime.MinValue.ToUniversalTime())
我不得不使用这个方法,因为我数据库中的“birthDateTimePicker.Date”类型是DateTime而不是DateTimeOffset,我不想转换它
谢谢我所有的朋友。不,我以前看过,但我不使用DateTimeOffsetI,我一点也不例外。你确定你发布了正确的代码示例吗?是的,我在代码中从服务器上得到了这个“1985-01-23”是在这个变量“patient\u date\u of\u birth”中,我在另一台计算机上尝试了这个代码,真的工作正常dt\u born\u dt
不是一个简单的DateTime
变量。这是一些GUI控件。它具有属性可见性
。不可复制。阅读并创建一个。正如@Jeppe所指出的,dt\u born\u dt
不是System.DateTime
类型。在内部,控件将使用DateTimeOffset
,其中您传递的日期将从DateTimeKind.Unspecified
转换为DateTimeKind.UTC
,在这里它将变成DateTime.MinValue
(假设您位于GMT+时区)。修复可能是dt\u born\u dt=DateTime.MinValue.SpecifyKind(DateTimeKind.UTC)
。谢谢,我使用了这个DateTimeOffset.MinValue,但我不能使用birthDatePicker.Date=DateTime.MinValue;当我在代码birthDatePicker.Date=DateTime.MinValue之后写入此行时,再次发生异常;是的,因为您应该使用birthDatePicker.Date=DateTimeOffset.MinValue
。再次创建一个。从你的描述来看,不清楚你在试图做什么DateTimeOffset someDateTimeOffset=DateTimeOffset.MinValue将编译并运行良好。正确。下面是该隐式运算符的。询问者应该包括一个堆栈跟踪;那么原因就更容易确定了。这不是一个好的解决方案。也许它在您的机器上工作(其时钟位于西半球格林威治之前),因为ToUniversalTime()
避免了异常。但它会在西半球起作用吗?在区域-06:00中,比如说,这会创建一个对应于0001/01/01 00:06:00的日期和时间吗?@JeppeStigNielsen我测试了许多时区,没有出现异常,它保存在我的数据库中,与0001/01/01 00:00:00对应,我犯了错误吗?
if (birthDateTimePicker.Date == DateTime.MinValue.ToUniversalTime())