gpt4 book ai didi

c# - .NET 中的日期时间溢出

转载 作者:可可西里 更新时间:2023-11-01 08:29:53 29 4
gpt4 key购买 nike

我们有一个 Scala/Java 后端,它生成与 .NET 中的 DateTime.MaxValue 等效的内容。

我收到以下日期作为字符串“9999-12-31T23:59:59.999999999Z”。

如果我使用 DateTime.TryParse("9999-12-31T23:59:59.999999999Z", out var dateTime),那么它会抛出一个 ArgumentOutOfRangeException(添加的或减去的值导致无法表示的 DateTime。参数名称:值)。

我没想到会这样,因为我正在调用 TryParse。也许返回 false 会更直观?

如果我减少年份,我可以看到 .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 中的错误?这是预期的行为吗?

最佳答案

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

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

  1. 用您自己的“编码”替换 Scala/Java 输出中的特殊值。例如作为“MaxValue”,或根据您的喜好选择。在 .Net 端,您将检测特殊值并相应地转换它们。

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

关于c# - .NET 中的日期时间溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52890501/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com