循环中的日期检查?Date类dayInWeek方法实现求助
解决你的日期相关问题
一、完成dayInWeek()方法的实现
你已经写好了处理1月和2月的核心逻辑,这刚好契合蔡勒(Zeller)公式的要求——这个公式就是用来计算某一天对应星期几的。接下来只需要补全公式计算部分,就能完美匹配你需要的星期规则了。
先把完整的方法代码写出来,再给你拆解细节:
public int dayInWeek () { int day, month; int year; // 年份后两位 int century; // 年份前两位 if(_month == 1 || _month == 2) { day = _day; month = _month + 12; year = (_year - 1) % 100; century = (_year - 1) / 100; } else { day = _day; month = _month; year = _year % 100; century = _year / 100; } // 套用蔡勒公式计算星期数值 int h = (day + (13 * (month + 1)) / 5 + year + year / 4 + century / 4 + 5 * century) % 7; // 刚好匹配你的规则:1=周日,6=周五,0=周六 return h; }
关键说明:
- 蔡勒公式的这个变体计算出的
h值,完全对应你的规则:h=1是周日、h=2是周一……h=6是周五、h=0是周六,不用额外转换。 - 代码里的除法是Java的整数除法(自动舍去小数部分),完全符合公式的要求。
- 要确保类里的
_year、_month、_day成员变量已经被正确初始化(比如通过构造函数赋值)。
二、循环中的日期检查处理
循环里的日期检查,核心是围绕日期合法性或日期序列遍历的正确性来处理,分两种常见场景给你方案:
1. 批量验证日期合法性(比如循环校验一批输入日期)
先实现一个日期合法性检查的工具方法,然后在循环中调用即可:
// 先写一个判断闰年的辅助方法 private boolean isLeapYear() { if (_year % 400 == 0) return true; if (_year % 100 == 0) return false; return _year % 4 == 0; } // 日期合法性检查方法 public boolean isValidDate() { // 先检查月份范围 if (_month < 1 || _month > 12) return false; // 计算当月最大天数 int maxDay; switch (_month) { case 4: case 6: case 9: case 11: maxDay = 30; break; case 2: maxDay = isLeapYear() ? 29 : 28; break; default: maxDay = 31; } return _day >= 1 && _day <= maxDay; }
循环中使用的示例:
// 假设dates是Date对象的列表 for (Date date : dates) { if (!date.isValidDate()) { System.out.println("日期[" + date + "]不合法,跳过处理"); continue; } // 这里写合法日期的业务逻辑 }
2. 遍历连续日期序列(比如从起始日到结束日循环)
如果是要生成或遍历连续日期,需要处理日期的递增进位逻辑,避免出现无效日期(比如1月32日):
// 先实现一个“获取下一天”的方法 public Date nextDay() { int newDay = _day + 1; int newMonth = _month; int newYear = _year; // 计算当月最大天数 int maxDay; switch (_month) { case 4: case 6: case 9: case 11: maxDay = 30; break; case 2: maxDay = isLeapYear() ? 29 : 28; break; default: maxDay = 31; } // 处理日进位到月 if (newDay > maxDay) { newDay = 1; newMonth++; // 处理月进位到年 if (newMonth > 12) { newMonth = 1; newYear++; } } return new Date(newYear, newMonth, newDay); // 假设类里有对应的构造函数 }
循环遍历的示例:
Date currentDate = startDate; while (!currentDate.isAfter(endDate)) { // 假设你实现了isAfter方法判断日期先后 System.out.println(currentDate + " 是星期" + currentDate.dayInWeek()); // 业务逻辑... currentDate = currentDate.nextDay(); }
内容的提问来源于stack exchange,提问作者Eric Parker
相关产品推荐
相关产品推荐

