C# 遍历日期列表并将月份修改为当前下一月的实现问题
解决方案
C# 中的 DateTime 是不可变值类型,无法直接修改其 Month 属性,你可以通过重新构造 DateTime 实例的方式仅替换月份,同时保留原日期的日、时分秒等信息。
核心逻辑说明
- 先计算当前时间的下一月对应的月份和年份,处理12月翻年的场景
- 构造新日期时,额外判断原日期的日是否超过目标月的最大天数,避免出现类似「4月31日」的非法日期报错
- 修正原有代码中循环遗漏最后一个元素的小问题
修改后完整代码
DataSet dslsip = mAE_Repo.FetchLastDayCustEmailsEquity_SIP_Content(); var ressip = (from r in dslsip.Tables[0].AsEnumerable() select r.Field<string>("emailid")).ToList(); var resdate = (from r in dslsip.Tables[0].AsEnumerable() select r.Field<DateTime>("a_confirmdatetime")).ToList(); // 预先计算目标年月,避免循环内重复计算 DateTime now = DateTime.Now; int targetMonth = now.Month + 1; int targetYear = now.Year; if (targetMonth > 12) { targetMonth = 1; targetYear += 1; } if (resdate != null && resdate.Count > 0) { // 修正原循环条件:原写法i < resdate.Count()-1会漏掉最后一个元素 for (int i = 0; i < resdate.Count; i++) { DateTime originalDate = resdate[i]; if (originalDate.Month <= now.Month) { // 处理日数超过目标月最大天数的场景 int targetDay = Math.Min(originalDate.Day, DateTime.DaysInMonth(targetYear, targetMonth)); // 构造新日期,保留原日期的时分秒 DateTime adjustedDate = new DateTime( targetYear, targetMonth, targetDay, originalDate.Hour, originalDate.Minute, originalDate.Second, originalDate.Millisecond ); // 替换原列表中的日期,后续写你自己的业务逻辑即可 resdate[i] = adjustedDate; } } }
效果示例
如你给出的示例:原日期为 2021-07-05 00:00:00,当前月份为9月,调整后日期为 2021-10-05 00:00:00,符合需求。
内容的提问来源于stack exchange,提问作者ashok
相关产品推荐
相关产品推荐

