You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 06:03:36