.NET中的DateTime溢出

Dav*_*iff 12 .net c# datetime parsing date

我们有一个Scala/Java后端,它DateTime.MaxValue在.NET中生成相当于的东西.

我被发送以下日期作为字符串"9999-12-31T23:59:59.999999999Z".

如果我使用DateTime.TryParse("9999-12-31T23:59:59.999999999Z", out var dateTime),则抛出一个ArgumentOutOfRangeException(添加或减去的值导致不可表示的DateTime.Parameter name:value).

我没想到这个,因为我打电话给Try Parse.也许返回虚假会更直观吗?

如果我减少这一年,我可以看到.NET将日期推迟到第二天,这显然不会在最大日期/时间工作!

DateTime.TryParse("9998-12-31T23:59:59.999999999Z", out var dateTime);
dateTime.ToString().Dump();
Run Code Online (Sandbox Code Playgroud)

输出:01/01/9999 00:00:00

如果我将ms的精度降低2,那么它可以工作:

DateTime.TryParse("9998-12-31T23:59:59.9999999Z", out var dateTime);
dateTime.ToString().Dump();
Run Code Online (Sandbox Code Playgroud)

产出:31/12/9998 23:59:59

这真的看起来像.NET中的一个错误?这是预期的行为吗?

小智 1

在不同平台之间传递最小/最大/无穷大等值是一个坏主意。每个平台可能都有自己的特殊值表示(不仅仅是日期)。因此,唯一有效的选项是传递纪元值(在大多数情况下,毫秒选项更可取),因为它们是双方都知道的。

如果由于某种原因上述不可能,那么你有两个丑陋的选择:

  1. 将 Scala/Java 输出中的特殊值替换为您自己的“编码”。例如“MaxValue”,或者根据您的需要进行选择。在 .Net 方面,您将检测特殊值并相应地翻译它们。

  2. 在 .Net 代码中插入一些简单的预处理。例如检查 "9999-12-31T23:59:59.999999999".StartsWith("9999") 最大值。