C#中如何组合DateTime日期与TimeSpan时间生成完整DateTime值
现有代码的核心问题
- 采用字符串拼接再二次解析的方案完全多余,不仅有不必要的性能损耗,还极容易触发格式解析异常:
TimeSpan.ToString()的默认输出格式并不固定,当时间值存在小于10的小时/分钟/秒分量、带毫秒精度、或者值超过24小时时,输出结果和你写死的yyyyMMddTHH:mm:ss解析格式无法匹配,直接抛出格式错误。比如存储的时间是8点9分5秒时,默认ToString输出为8:09:05,缺少小时位的前导零,解析必然失败。 - 没有处理查询结果为空的边界情况:
FirstOrDefault在找不到匹配数据时会返回null,后续直接访问postThr的属性会触发空引用异常。 - 没有显式剥离
ThrDate字段自带的时间分量,虽然当前用ToString("yyyyMMdd")暂时规避了这个问题,但后续如果改动格式字符串,很容易把原字段自带的时间值混入结果,存在逻辑隐患。
最优实现方案
DateTime类型原生支持和TimeSpan直接做加法运算,不需要经过任何字符串转换,是性能最高、最不容易出错的方案,代码如下:
PostThr postThr = _context.PostThrs.FirstOrDefault(m => m.ThrZero == zero && m.ThrText == "SCHEDULED START-"); // 先处理查询无结果的边界情况,按自身业务需求调整处理逻辑即可 if (postThr == null) { throw new InvalidOperationException("未找到匹配的计划开始时间记录"); } // 取日期部分(剥离原字段自带的时间分量,得到当日0点的基准值),和存储时间的TimeSpan直接相加 DateTime trafficDate = postThr.ThrDate.Date + postThr.ThrTime;
说明:
DateTime.Date属性返回的新DateTime值会保留原日期的年/月/日分量,时间分量固定为00:00:00,和代表时间偏移的TimeSpan相加时,运行时会自动计算得到准确的完整时间,不存在任何格式兼容问题。如果你的TimeSpan值超过24小时(比如跨天的时间配置),加法运算也会自动完成日期进位,不需要额外编写逻辑。
如果业务上要求存储的TimeSpan必须是当日合法时间(即时间范围在00:00:00到23:59:59.999...之间),可以在相加前增加校验:
if (postThr.ThrTime < TimeSpan.Zero || postThr.ThrTime >= TimeSpan.FromDays(1)) { throw new ArgumentException("存储的时间值不在当日合法时间范围内"); }
内容的提问来源于stack exchange,提问作者Nick Fleetwood
相关产品推荐
相关产品推荐

