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();
输出:01/01/9999 00:00:00
如果我将ms的精度降低2,那么它可以工作:
DateTime.TryParse("9998-12-31T23:59:59.9999999Z", out var dateTime);
dateTime.ToString().Dump();
产出:31/12/9998 23:59:59
这真的看起来像.NET中的一个错误?这是预期的行为吗?
小智 1
在不同平台之间传递最小/最大/无穷大等值是一个坏主意。每个平台可能都有自己的特殊值表示(不仅仅是日期)。因此,唯一有效的选项是传递纪元值(在大多数情况下,毫秒选项更可取),因为它们是双方都知道的。
如果由于某种原因上述不可能,那么你有两个丑陋的选择:
将 Scala/Java 输出中的特殊值替换为您自己的“编码”。例如“MaxValue”,或者根据您的需要进行选择。在 .Net 方面,您将检测特殊值并相应地翻译它们。
在 .Net 代码中插入一些简单的预处理。例如检查 
"9999-12-31T23:59:59.999999999".StartsWith("9999")
最大值。