C#计算两个DateTime差值并转换为小时单位的double类型
原实现合理性判断
你当前的实现存在多处缺陷,不建议生产环境使用:
- 逻辑容错性极低:当时间差≥24小时时,
TimeSpan.ToString()输出会携带天数字段(格式为d.hh:mm:ss),此时按冒号拆分后第一个元素会包含天数和小时的组合值,解析结果完全错误。比如你给出的测试用例实际时间差是36小时,按你的逻辑拆分后拿到的第一个值是1.12,最终计算结果和预期完全不符。 - 环境兼容性差:
TimeSpan的字符串输出格式和当前系统区域设置强相关,部分区域的时间分隔符不是冒号,会直接导致拆分失败抛出异常。 - 存在精度损失:你的逻辑只计算了小时和分钟部分,秒、毫秒分量会被直接丢弃,无法满足高精度统计需求。
最优实现方案
TimeSpan结构体本身已经提供了开箱即用的TotalHours属性,该属性本身就是double类型,会自动将天、小时、分钟、秒、毫秒等所有时间分量全部换算为小时总和,无需任何手动字符串处理,代码简洁且稳定性极高:
static void Main() { string tin = "Nov 08, 2021 4:23 PM"; string tout = "Nov 10, 2021 4:23 AM"; DateTime t1 = DateTime.Parse(tin); DateTime t2 = DateTime.Parse(tout); TimeSpan workingTime = t2 - t1; double totalHours = workingTime.TotalHours; Console.Write(totalHours); }
如果你的场景需要跨时区或者涉及夏令时切换,建议将DateTime替换为DateTimeOffset解析时间,避免时区歧义导致的计算误差。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

