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())