如何在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
相关产品推荐
相关产品推荐

