如何在C#中实现符合验收标准的DateTime时间校验与格式化输出?
问题修正与实现方案
原代码存在几处逻辑错误,无法正确满足验收标准,同时需要优化用户提示和输出格式化逻辑,以下是具体修正方案:
原代码问题点
- 时间差判断逻辑错误:仅通过
TimeOfDay.Hours相减会忽略跨天场景(如当前23:30,输入次日00:30)和分钟级差异,导致判断不准确 - 循环退出逻辑错误:解析成功但时间不符合条件时直接退出循环,未引导用户重新输入
- 错误提示不匹配:解析失败时错误提示时间条件要求,混淆了格式错误与时间合规性错误
修正后的完整代码
private DateTime _tempDateTime; public DateTime DeliveryStart { get; set; } public DateTime DeliveryEnd { get; set; } // 输入并验证配送开始时间 while (true) { Util.GetInput("Delivery window start (dd/mm/yyyy hh:mm)"); string userInput = Console.ReadLine(); if (DateTime.TryParse(userInput, out _tempDateTime)) { // 直接比较当前时间+1小时,确保开始时间满足要求 if (_tempDateTime >= DateTime.Now.AddHours(1)) { DeliveryStart = _tempDateTime; break; } Console.WriteLine("\tDelivery window start must be at least one hour in the future."); } else { Console.WriteLine("\tInvalid date format. Please enter in dd/mm/yyyy hh:mm."); } } // 输入并验证配送结束时间 while (true) { Util.GetInput("Delivery window end (dd/mm/yyyy hh:mm)"); string userInput = Console.ReadLine(); if (DateTime.TryParse(userInput, out _tempDateTime)) { // 比较开始时间+1小时,确保结束时间满足要求 if (_tempDateTime >= DeliveryStart.AddHours(1)) { DeliveryEnd = _tempDateTime; break; } Console.WriteLine("\tDelivery window end must be at least one hour later than the start."); } else { Console.WriteLine("\tInvalid date format. Please enter in dd/mm/yyyy hh:mm."); } } // 生成指定格式的输出字符串 string output = $"The pickup window for your order will be {DeliveryStart.ToString("HH:mm on dd/MM/yyyy")} and {DeliveryEnd.ToString("HH:mm on dd/MM/yyyy")}"; Console.WriteLine(output);
关键说明
- 时间判断优化:使用
DateTime.Now.AddHours(1)和DeliveryStart.AddHours(1)直接获取阈值时间,通过>=运算符完成准确比较,无需手动计算小时差 - 错误提示区分:分别处理日期格式错误和时间合规性错误,提升用户输入体验
- 格式化输出:通过
ToString("HH:mm on dd/MM/yyyy")实现指定格式:HH:24小时制两位小时数mm:两位分钟数dd:两位日期MM:两位月份(注意大写,小写mm代表分钟)yyyy:四位年份
内容的提问来源于stack exchange,提问作者cooperano
相关产品推荐
相关产品推荐

