在C#中实现超过24:00的时间求和(如23:00+02:00=25:00)
在C#中实现时长累加并自定义格式化输出
要实现时长累加(比如23:00 + 02:00 = 25:00),并在超过24小时时输出类似1.01:20的格式,核心是用TimeSpan类型处理时间间隔——它天生支持累加操作,再配合自定义格式化就能满足需求。
步骤1:解析单段时长为TimeSpan
首先得把输入的HH:mm格式字符串转换成TimeSpan对象,用TimeSpan.TryParseExact可以精确指定格式,避免解析错误:
// 解析HH:mm格式的时长字符串 bool ParseDuration(string durationStr, out TimeSpan duration) { return TimeSpan.TryParseExact(durationStr, @"hh\:mm", null, out duration); }
步骤2:累加所有时长
把所有解析后的TimeSpan直接相加即可得到总时长:
// 示例:累加多个时长 var durations = new List<string> { "23:00", "02:00" }; TimeSpan totalDuration = TimeSpan.Zero; foreach (var str in durations) { if (ParseDuration(str, out var span)) { totalDuration += span; } else { // 处理无效格式,这里直接抛出异常,你也可以改成日志提示 throw new ArgumentException($"无效时长格式:{str},请使用HH:mm格式"); } }
步骤3:自定义格式化输出
根据总时长的长度,选择对应的输出格式:
- 不足24小时:直接输出
HH:mm - 超过24小时:两种可选格式,按需选择:
- 格式1:总小时数:分钟(如25:00)
- 格式2:天.小时:分钟(如1.01:00,代表1天1小时0分钟)
实现格式化的代码:
string FormatTotalDuration(TimeSpan total) { if (total.TotalHours < 24) { return total.ToString(@"hh\:mm"); } else { // 格式1:输出总小时数和分钟 // return $"{(int)total.TotalHours}:{total.Minutes:D2}"; // 格式2:输出天数、小时和分钟 return $"{total.Days}.{total.Hours:D2}:{total.Minutes:D2}"; } }
完整可运行示例
把上面的逻辑整合起来,就能直接运行测试:
using System; using System.Collections.Generic; class Program { static void Main() { // 测试用的时长列表 var durationList = new List<string> { "23:00", "02:00", "00:45" }; TimeSpan total = GetTotalDuration(durationList); string result = FormatDuration(total); Console.WriteLine($"累加结果:{result}"); // 选格式1输出:26:45;选格式2输出:1.02:45 } static TimeSpan GetTotalDuration(List<string> durationStrings) { TimeSpan total = TimeSpan.Zero; foreach (var str in durationStrings) { if (!ParseDuration(str, out var span)) { throw new ArgumentException($"无法解析时长:{str},请确保格式为HH:mm"); } total += span; } return total; } static bool ParseDuration(string durationStr, out TimeSpan duration) { return TimeSpan.TryParseExact(durationStr, @"hh\:mm", null, out duration); } static string FormatDuration(TimeSpan total) { if (total.TotalHours < 24) { return total.ToString(@"hh\:mm"); } else { // 切换格式只需注释/取消注释对应行 // return $"{(int)total.TotalHours}:{total.Minutes:D2}"; return $"{total.Days}.{total.Hours:D2}:{total.Minutes:D2}"; } } }
注意事项
- 如果需要支持包含秒的格式(如
HH:mm:ss),只需把解析和格式化的格式字符串改成@"hh\:mm\:ss"。 D2用于保证分钟数是两位数字(比如1分钟显示为01),避免出现25:5这种不规范格式。- 如果要支持更复杂的输入格式(比如包含天数的
1.02:30),可以扩展解析逻辑,先拆分天数和时分部分再转换为TimeSpan。
内容的提问来源于stack exchange,提问作者Aykut Günhan
相关产品推荐
相关产品推荐

