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
相关产品推荐
相关产品推荐

