You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6与.NET 8中DateTime.AddHours计算结果差异问题咨询

.NET 6与.NET 8代码结果差异原因分析

你的代码逻辑是计算start到end的总小时数,再将该小时数加回start得到newEnd,但在两个.NET版本中得到不同结果:
-.NET 6中newEnd的字符串表示为'8/12/2025 11:59:59'
-.NET 8中newEnd的字符串表示为'8/12/2025 11:59:58'

核心原因:浮点数精度限制

问题出在double hoursDiff = end.Subtract(start).TotalHours这一行:
TotalHours返回的是double类型浮点数,而二进制浮点数无法精确表示所有十进制小数。

计算实际时间差:从2025-08-10 00:00:00到2025-08-12 23:59:59,总时长为2天23小时59分59秒,转换成小时是71.99972222222222...——这是一个无限循环的小数,用double存储时会产生精度损失,得到的是一个接近但不完全等于真实值的近似值。

.NET 6和.NET 8在处理这个近似浮点数的舍入逻辑、DateTime内部计算上存在细微调整,最终导致结果差了1秒。

修复方案

避免使用浮点数传递时间差,改用精确的TimeSpan类型直接存储时间跨度:

DateTime start = new DateTime(2025, 08, 10, 0, 0, 0);
DateTime end = new DateTime(2025, 08, 12, 23, 59, 59);

TimeSpan diff = end.Subtract(start);
DateTime newEnd = start.Add(diff);

这种方式下newEnd会精确等于end,且在所有.NET版本中结果一致。

内容的提问来源于stack exchange,提问作者Aviv Dayan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:42:35