C#计算起止时间耗时异常,如何实现简洁输入并得到正确结果?
问题分析与解决方案
现有代码的核心问题
- 格式字符串
HH:mm是24小时制规则,无法解析带pm的12小时制时间;且用户要求输入无需pm标识,需同步调整输入格式与解析逻辑。 - 时间差计算方向错误:
startTimeSpan - endTimeSpan会得到负数结果,正确逻辑应为结束时间减开始时间。 - 输出格式不匹配需求:当前输出是时分字符串,而用户需要的是小数形式的小时(如
1.5 hours)。
修正后的代码实现
方案一:极简下午时段输入(无需任何时段标识)
如果输入默认都是下午时间(比如6:00代表18:00,8:30代表20:30),可直接给解析后的时间加12小时:
using System; public class Program { public static void Main() { // 极简输入:仅时分,默认下午时段 string startTime = "6:00"; string endTime = "8:30"; // 解析为基础时间,再转换为下午时段 TimeSpan.TryParse(startTime, out TimeSpan startSpan); TimeSpan.TryParse(endTime, out TimeSpan endSpan); startSpan = startSpan.Add(TimeSpan.FromHours(12)); endSpan = endSpan.Add(TimeSpan.FromHours(12)); // 计算正确耗时 TimeSpan elapsed = endSpan - startSpan; // 转换为带小数的总小时数 double totalHours = elapsed.TotalHours; Console.WriteLine($"{totalHours} hours"); } }
方案二:兼容上午/下午的极简输入
若需要区分上午下午,用a/p替代冗长的am/pm,保证输入简洁:
using System; using System.Globalization; public class Program { public static void Main() { // 极简输入:用a/p标识上午/下午 string startTime = "6:00p"; string endTime = "8:30p"; // 定义支持的简洁格式 string[] formats = {"h:mm\\a", "h:mm\\p", "H:mm"}; DateTime startDt = DateTime.ParseExact(startTime, formats, CultureInfo.InvariantCulture, DateTimeStyles.None); DateTime endDt = DateTime.ParseExact(endTime, formats, CultureInfo.InvariantCulture, DateTimeStyles.None); TimeSpan elapsed = endDt - startDt; double totalHours = elapsed.TotalHours; Console.WriteLine($"{totalHours} hours"); } }
关键要点
- 使用
TimeSpan.TotalHours可直接获取带小数的总小时数,完美匹配1.5 hours的输出要求。 - 两种方案都满足输入简洁的需求,无需输入
p.m.类标识。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

