The says
value 参数四舍五入到最接近的毫秒。
然而,这在 .NET 7 中显然不再成立。考虑以下最小示例(小提琴.NET 4.7.2 https://dotnetfiddle.net/zwmCQT, 小提琴.NET 7 https://dotnetfiddle.net/xLnpy2):
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
这是故意的更改(即文档有错误/过时),还是我在 .NET 7 中发现了错误?
Notes:
- 我知道“浮点不精确”。这不是这里的问题,因为 DateTime 内部使用(精确的)刻度。
- 相关问题关于动机四舍五入到最接近的毫秒后:为什么 DateTime.AddDays 舍入到最接近的毫秒? https://stackoverflow.com/q/27027033/87698
- 我知道转换“Excel日期”的正确方法 https://stackoverflow.com/q/11968570/87698是使用
FromOADate
, which does正确舍入。这只是一个最小的例子,用于证明观察到的行为与记录的行为之间的差异AddDays
.
https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/7.0/datetime-add- precision 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)的行为保持不变。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)