【问题标题】:The exeption UTC time represented when the offset is applied must be between year 0 and 10,000. occurred in some computers应用偏移量时表示的异常 UTC 时间必须介于 0 年和 10,000 年之间。发生在某些计算机上
【发布时间】:2015-12-23 09:12:42
【问题描述】:

我在使用C# 的Windows 应用商店应用程序中有以下code

birthDateTimePicker.Date = DateTime.Now;
if (birthDateTimePicker.Date == DateTime.MinValue)
{
    no_date_lable.Visibility = Visibility.Collapsed;
    birthDateTimePicker.Visibility = Visibility.Collapsed;
}

注意:这一行birthDateTimePicker.Date = DateTime.Now; 是例如真正的用户将选择或者它将来自服务器。

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

如果(dt_born_dt == DateTime.MinValue)

抛出异常的原因是什么:

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

真的,我在三台计算机上测试过,其中一台出现错误!!!

我将系统的时区更改为 (UTC-08:00) 太平洋时间(美国和加拿大),但根本没有出现此异常,并且代码正常工作!

我的问题实际上是为什么在其时区为 (UTC+03:30) 德黑兰的系统中发生此异常!

对不起我的英语不好

【问题讨论】:

  • 不,我以前看过这个,但我不使用 DateTimeOffset
  • 我没有得到任何异常完全。您确定您发布了正确的代码示例吗?
  • 是的,我只是在我的代码中从服务器获取了这个“1985-01-23”,它在这个变量“patient_date_of_birth”中,我在另一台计算机上尝试了这个代码,确实工作正常!!!跨度>
  • dt_born_dt 不是一个简单的 DateTime 变量。它是一些 GUI 控件。它有一个属性Visibility
  • 不可重现。阅读How to Ask 并创建一个minimal reproducible example。正如@Jeppe 所指出的,dt_born_dt 不是System.DateTime 类型。在内部,控件将使用DateTimeOffset,您传递的日期将从DateTimeKind.Unspecified 转换为DateTimeKind.UTC,它将变为DateTime.MinValue(假设您处于GMT+ 时区)。修复可能是dt_born_dt = DateTime.MinValue.SpecifyKind(DateTimeKind.UTC)

标签: c# utc


【解决方案1】:

所以您可以控制dt_born_dt(请使用有意义的名称,例如birthDateTimePicker,并考虑出生日期不需要时间,而且肯定不能是第 1 年[没有年龄 ~2015 年的人还活着now],也许使用可空类型)具有DateTimeOffset 类型的Date 属性,从调试器显示的+3:30 值可见。

现在这个类型有一个从DateTime 的隐式转换,所以如果你这样做:

birthDatePicker.Date = DateTime.MinValue;

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

解决方法:使用DateTimeOffset.MinValue

另外,不要在Parse(Exact) 周围使用try-catch;使用TryParse(Exact)

【讨论】:

  • 谢谢,我使用了这个 DateTimeOffset.MinValue 但我不能使用birthDatePicker.Date = DateTime.MinValue;当我在代码birthDatePicker.Date = DateTime.MinValue; 之后编写此行时再次发生异常
  • 是的,因为你应该使用birthDatePicker.Date = DateTimeOffset.MinValue
  • 再次创建minimal reproducible example。根据您的描述,不清楚您要做什么。 DateTimeOffset someDateTimeOffset = DateTimeOffset.MinValue 将编译并运行得很好。
  • 正确。这是documentationimplicit operator。提问者应该包含堆栈跟踪;那么原因会更容易确定。
【解决方案2】:

@CodeCaster 的回答非常完整且很有帮助。但是,解决此问题的另一种方法是将“DateTime.MinValue”转换为 UTC

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

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

谢谢我所有的朋友。

【讨论】:

  • 这不是一个好的解决方案。也许它可以在您的机器上运行(其时钟比西半球格林威治早),因为ToUniversalTime() 避免了异常。但它会在西半球起作用吗?例如,在 -06:00 区域,这会创建一个对应于 0001/01/01 00:06:00 的日期和时间吗?
  • @JeppeStigNielsen 我测试了许多时区并没有出现异常,它以 0001/01/01 00:00:00 保存在我的数据库中,我犯错了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多