如何从System.DayOfWeek列表中获取指定起始DateTime的下一个符合条件的日期
实现代码
public static DateTime GetNextWeekday(DateTime start, IEnumerable<DayOfWeek> days) { // 输入参数合法性校验 if (days == null) throw new ArgumentNullException(nameof(days)); if (!days.Any()) throw new ArgumentException("星期集合不可为空", nameof(days)); // 转为HashSet提升查询效率 var targetDays = new HashSet<DayOfWeek>(days); // 最多遍历7天必然匹配到符合条件的日期 for (int offset = 0; offset < 7; offset++) { var currentDay = start.AddDays(offset); if (targetDays.Contains(currentDay.DayOfWeek)) { return currentDay; } } // 防御性返回,理论上不会执行到此处 return start; }
逻辑说明
- 如果需要排除起始日期当天的匹配,只需要将循环的起始偏移量从
0修改为1即可 - 示例验证:起始日期为
2021-06-16(星期三),传入列表仅包含DayOfWeek.Monday时,循环偏移量到5时匹配到周一,对应日期2021-06-21,与预期结果完全一致
内容的提问来源于stack exchange,提问作者Vinyl Warmth
相关产品推荐
相关产品推荐

