6

我正在尝试将 DateTime.MinValue 转换为 DateTimeOffset 值,但出现 ArgumentOutOfRange 异常。

我正在查看有关 DateTime 到 DateTimeOffset 的隐式转换的 MSDN 文章,异常部分指出我将在以下时间收到此 ArgumentOutOfRange 异常;

... 应用偏移产生的协调世界时 (UTC) 日期和时间于 MinValue。...

那么为什么下面的代码会抛出异常;

DateTime test = DateTime.MinValue;
DateTimeOffset dto = test;

仅仅是因为我的时区吗?我在 GMT +8,但我对上述代码的理解是,测试是使用未指定类型创建的。

我通过简单地测试我的 DateTime 的 MinValue 来解决这个问题,如果是这样,那么使用 DateTimeOffset.MinValue 代替。

我只是好奇为什么我的未指定种类的 DateTime 对象会导致错误。

4

1 回答 1

7

如果您在 GMT+8 中,则 的本地时间DateTime.MinValue对应于早于的UTCDateTime.MinValue时间,因此例外。从您引用的文档中:

如果 DateTime.Kind 属性的值为 DateTimeKind.Local 或 DateTimeKind.Unspecified,则 DateTimeOffset 对象的日期和时间设置为等于 dateTime,其 Offset 属性设置为等于本地系统当前时区的偏移量。

所以从逻辑上讲,你会有一个8小时DateTime的时间,但这意味着应用偏移量产生的 UTC 日期/时间早于可以表示的时间。MinValueOffset

(不要忘记您向 UTC添加偏移量以获得本地时间,或从本地时间中减去它以获得 UTC。在Noda Time中,我们通过使用每个OffsetLocalInstant和的类型来强制执行此操作Instant,并且只允许您执行适当的操作...)

于 2011-08-03T09:23:43.447 回答