如何处理到达12月时触发的System.ArgumentOutOfRangeException异常?
问题说明
代码意图是获取下一个月的所有日期并格式化为德语格式,但执行时会抛出System.ArgumentOutOfRangeException异常:
DateTime startOfMonth = new DateTime(startTime.Year, startTime.Month+1, 1);
原因是当startTime为12月时,startTime.Month+1等于13,超出了月份的合法范围(1-12),且未自动处理年份进位。
解决方案
不要手动计算月份和年份,直接使用DateTime.AddMonths()方法,它会自动处理年份进位逻辑(12月加1个月自动跳转到下一年1月),同时修正月份天数的获取逻辑,确保取的是下一个月的天数。
修改后的完整代码:
public static List<string> GetMonthDays() { DateTime startTime = DateTime.Now; // 直接用AddMonths获取下一个月的第一天,自动处理年份进位 DateTime startOfMonth = startTime.AddMonths(1).Date; // 获取下一个月的总天数 int daysInMonth = DateTime.DaysInMonth(startOfMonth.Year, startOfMonth.Month); List<string> nextMonthDays = new List<string>(); // 把CultureInfo创建移到循环外,避免重复实例化 CultureInfo germanCulture = new CultureInfo("de-DE"); for (int i = 0; i < daysInMonth; ++i) { DateTime currentDate = startOfMonth.AddDays(i); nextMonthDays.Add(currentDate.ToString("dddd - dd.MM.yy", germanCulture)); } return nextMonthDays; }
关键修改点
- 自动处理月份进位:用
startTime.AddMonths(1)替代手动Month+1,12月调用后会自动生成下一年1月的日期,完全规避非法月份的问题。 - 修正天数获取:原代码错误地取了当前月的天数,现在改为取下一个月(
startOfMonth)的年份和月份来计算天数,确保天数准确。 - 性能优化:将
CultureInfo的实例化移到循环外部,避免每次循环都创建新对象,提升执行效率。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

