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

如何在C#中合理展示DateTime对象及其时间差?

问题解答:DateTime与TimeSpan无法共用格式化字符串

核心结论

不存在可以同时用于DateTime和TimeSpan的格式化字符串,两者的格式化规则完全独立,混用会直接抛出FormatException。

报错原因

DateTime的格式化字符串(如yyyy-MM-dd HH:mm:ss.fff)是针对绝对日期时间设计的,包含年份、月份等日期维度的格式符;而TimeSpan表示的是时间间隔,它的格式化规则只针对天数、小时、分钟等间隔维度,不支持yyyy、MM这类日期相关的格式符。你尝试用DateTime的格式字符串去格式化TimeSpan对象,自然会触发格式错误。

正确的TimeSpan格式化方法

针对TimeSpan,需要使用它专属的格式字符串,常见用法分两种场景:

  • 若时间间隔可能超过24小时,需包含天数:@"d\.HH:mm:ss.fff"(d代表天数,\.用于分隔天数和小时部分,避免被解析为格式符)
  • 若确定时间间隔不超过24小时,可直接用:"HH:mm:ss.fff"

修正后的代码示例

// 原时间戳展示代码(正常运行)
Console.WriteLine($"Start        time: {DT_Start.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
Console.WriteLine($"Intermediate time: {DT_Intermediate.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
Console.WriteLine($"End          time: {DT_End.ToString("yyyy-MM-dd HH:mm:ss.fff")}");

// 修正后的时间差展示代码
TimeSpan elapsedStartToMid = DT_Intermediate - DT_Start;
TimeSpan elapsedMidToEnd = DT_End - DT_Intermediate;

// 包含天数的格式化输出
Console.WriteLine($"Elapsed times: [{elapsedStartToMid.ToString(@"d\.HH:mm:ss.fff")}] and [{elapsedMidToEnd.ToString(@"d\.HH:mm:ss.fff")}]");

// 仅展示时分秒(适用于间隔不超过24小时的场景)
Console.WriteLine($"Elapsed times (short): [{elapsedStartToMid.ToString("HH:mm:ss.fff")}] and [{elapsedMidToEnd.ToString("HH:mm:ss.fff")}]");

补充说明

TimeSpan的格式化字符串中,部分细节需要注意:

  • 大写HH表示24小时制小时数,小写hh表示12小时制
  • fff用于精确到毫秒的展示
  • 如果需要在格式字符串中添加固定字符(如点、横线),需用@前缀避免转义,或者用反斜杠\转义单个字符

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:56:34