为什么在 .NET 7 中 DateTime.AddDays 不再四舍五入到最接近的毫秒?

Hei*_*nzi 5 .net c# datetime .net-core

.NET 7 文档DateTime.AddDays(double)

value 参数四舍五入到最接近的毫秒。

然而,这在 .NET 7 中显然不再成立。考虑以下最小示例(fiddle .NET 4.7.2fiddle .NET 7):

var d = 42005.416666666664; // Excel date
var date = new DateTime(1900, 1, 1, 0, 0, 0, 0).AddDays(d - 2.0);

Console.WriteLine(date.ToString("o"));

// .NET 4.8: Prints 2015-01-01T10:00:00.0000000
// .NET 7:   Prints 2015-01-01T09:59:59.9999997
Run Code Online (Sandbox Code Playgroud)

这是故意的更改(即文档有问题/过时),还是我发现了 .NET 7 中的错误?


笔记:

小智 1

https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/7.0/datetime-add- precision

在 .NET 7 中,DateTime.AddDays 方法的行为已更改,它不再舍入到最接近的毫秒。进行此更改是为了使 DateTime 的行为与基础数据类型的行为保持一致,基础数据类型是自 0001 年 1 月 1 日以来 100 纳秒间隔数的 64 位二进制表示形式。

在.NET的早期版本中,DateTime被实现为具有高精度内部表示的结构,并且其值在显示或转换为字符串时四舍五入到最接近的毫秒。但是,这种舍入可能会在某些情况下导致不准确,例如在添加或减去日期时。

随着 .NET 7 中的更改,DateTime 的行为变得更加可预测和一致,并且它提供了更准确的日期和时间表示。如果需要显示具有特定精度的日期时间值,可以使用 ToString 方法并根据需要格式化输出。

请务必注意,此更改仅影响 DateTime.AddDays 的行为,而不影响 DateTime 结构的其他方法。其他方法(例如 DateTime.AddHours 或 DateTime.AddMilliseconds)的行为保持不变。