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

DateTime构造函数不支持大于12的小时值,如何解决该异常?

解决DateTime构造函数因小时值超出范围抛出异常的问题

首先,咱们得明确为什么会抛出这个异常:.NET里的DateTime构造函数对小时参数的要求是必须在0到23之间,一旦输入的小时值超出这个范围(不管是大于23还是小于0),就会触发ArgumentOutOfRangeException。

针对你的需求(支持大于12的小时值),分两种场景给你解决方案:


场景1:只需要支持合法的24小时制时间(13-23点)

这种情况你需要先对输入的小时、分钟做合法性校验,确保它们在有效范围内,再创建DateTime对象,同时建议用更安全的转换方式避免格式错误:

// 先安全转换输入值,避免非数字输入抛出异常
if (!int.TryParse(hb.EndHours, out int endHour))
{
    return BadRequest("请输入有效的小时数值");
}
if (!int.TryParse(hb.EndMinutes, out int endMinute))
{
    return BadRequest("请输入有效的分钟数值");
}

// 校验时间范围
if (endHour < 0 || endHour > 23)
{
    return BadRequest("小时值必须在0-23之间");
}
if (endMinute < 0 || endMinute > 59)
{
    return BadRequest("分钟值必须在0-59之间");
}

// 现在创建DateTime就不会报错了
DateTime endFinal = new DateTime(end.Year, end.Month, end.Day, endHour, endMinute, 0);

场景2:需要支持超过24的小时值(比如输入25小时自动转为次日1点)

如果你的业务允许输入累计时长(比如25小时、30小时这类),那不要直接用DateTime构造函数,而是用TimeSpan来计算偏移量:

// 同样先做安全转换
if (!int.TryParse(hb.EndHours, out int endHour))
{
    return BadRequest("请输入有效的小时数值");
}
if (!int.TryParse(hb.EndMinutes, out int endMinute))
{
    return BadRequest("请输入有效的分钟数值");
}

// 用TimeSpan表示输入的时长
TimeSpan timeOffset = new TimeSpan(endHour, endMinute, 0);
// 把时长加到基础日期上,自动处理跨天情况
DateTime endFinal = new DateTime(end.Year, end.Month, end.Day).Add(timeOffset);

比如输入25小时30分钟,endFinal会自动变成end日期的次日1点30分,完全不会抛出异常。


额外提醒

在Web API场景下,一定要把输入校验的错误信息清晰返回给前端,这样调用方才能快速知道问题所在,避免无效请求。

内容的提问来源于stack exchange,提问作者dan mann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:17:34