实现订单时间差校验时触发DateTime格式异常,寻求解决方案
问题分析与解决方案
咱们先拆解你遇到的两个核心问题:格式解析异常和时间差判断逻辑错误,一步步来解决:
1. 解决FormatException格式解析错误
报错信息里的字符串是 12/9/2019 12:00:00 AM,这个格式是MM/dd/yyyy hh:mm:ss tt(注意日期用/分隔,上午/下午标识tt前是空格,不是冒号),但你代码里用的格式字符串是"dd-MM-yyyy hh:mm:ss:tt",完全不匹配,这就是触发异常的根本原因。
另外还有个冗余操作:如果orderData.ArriveTime和orderData.OrderDate本身已经是DateTime类型(你提到设为DateTime.Today和DateTime.Now),那根本不需要转成字符串再Parse!直接用原类型就行,多此一举的转换反而容易出问题。
2. 修正时间差判断逻辑
你的代码里犯了几个逻辑错误:
arriveTime.Subtract(orderDate)返回的是TimeSpan类型(表示时间间隔),不是DateTime,用Convert.ToDateTime转换完全错误;- 判断条件的逻辑混乱,你要的是“时间差在10分钟到2小时之间”,应该直接判断TimeSpan的总分钟数在10到120之间;
- null判断的位置不对,应该先检查
orderData.ArriveTime和orderData.OrderDate是否为null,再进行计算。
修正后的完整代码
private bool TimerRequirements(IOrderData orderData) { // 先判断必要字段是否为null,避免空引用异常 if (orderData.ArriveTime == null || orderData.OrderDate == null) { return false; // 这里也可以根据业务需求抛异常,看你实际场景 } // 如果orderData的这两个字段已经是DateTime类型,直接强转使用即可 DateTime arriveTime = (DateTime)orderData.ArriveTime; DateTime orderDate = (DateTime)orderData.OrderDate; // 计算两个时间的间隔 TimeSpan timeDiff = arriveTime.Subtract(orderDate); // 判断时间差是否在10分钟到2小时(120分钟)之间 return timeDiff.TotalMinutes >= 10 && timeDiff.TotalMinutes <= 120; }
额外注意点
- 如果
orderData.ArriveTime或orderData.OrderDate是字符串类型,那你需要用对应格式解析,比如匹配报错字符串的格式应该写:DateTime arriveTime = DateTime.ParseExact(orderData.ArriveTime.ToString(), "MM/dd/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture); - 要考虑时间差为负的情况:如果
ArriveTime可能早于OrderDate,可以用Math.Abs(timeDiff.TotalMinutes)来做判断。
内容的提问来源于stack exchange,提问作者zhrgci
相关产品推荐
相关产品推荐

