java.time
我建议您使用现代 Java 日期和时间 API java.time 进行日期和时间工作。例如:
LocalDate ld = LocalDate.now(ZoneId.systemDefault())
.with(DayOfWeek.TUESDAY);
System.out.println(ld);
今天,6 月 5 日星期六,当我运行此代码时,输出为:
2021-06-01
是的,6 月 1 日是星期二。由于我们将枚举常量传递给with(),因此实际上不可能传递超出范围的值。 DayOfWeek 是一个枚举,在一周的 7 天中包含 7 个值。我们唯一能遇到的麻烦是传递null,它会抛出一个NullPointerException,我认为这是你想要的。
如果我们确实坚持将星期几作为数字传递,那是可能的。 java.time 对从星期一 = 1 到星期日 = 7 的一周中的天数进行编号。
LocalDate ld = LocalDate.now(ZoneId.systemDefault())
.with(ChronoField.DAY_OF_WEEK, 2);
到目前为止,输出和以前一样是2021-06-01。但是如果我们通过 0 呢?
.with(ChronoField.DAY_OF_WEEK, 0);
线程“主”java.time.DateTimeException 中的异常:无效值
对于 DayOfWeek(有效值 1 - 7):0
我们不仅会收到您要求的例外情况,而且还会收到一条清晰且有用的例外信息,恕我直言。
星期零在这里如何工作?
Calendar 星期 0 的工作方式与 7 = 星期六相同。似乎至少有一个宽松的老式 GregorianCalendar 在星期几执行一种模 7 运算,以将其置于 1 到 7 的区间内。我没有发现这个记录。 GregorianCalendar 可能是您正在处理的Calendar 的具体子类。我尝试了不同的数字,它们都等于 7 模 7:
int[] dows = { 0, 7, -7, 14, -14, -98 };
for (int dow : dows) {
Calendar cal = new GregorianCalendar(2021, Calendar.JUNE, 2);
Date dateBefore = cal.getTime();
cal.set(Calendar.DAY_OF_WEEK, dow);
System.out.format("%s and day of week %3d yields %s%n", dateBefore, dow, cal.getTime());
}
输出:
Wed Jun 02 00:00:00 CEST 2021 and day of week 0 yields Sat Jun 05 00:00:00 CEST 2021
Wed Jun 02 00:00:00 CEST 2021 and day of week 7 yields Sat Jun 05 00:00:00 CEST 2021
Wed Jun 02 00:00:00 CEST 2021 and day of week -7 yields Sat Jun 05 00:00:00 CEST 2021
Wed Jun 02 00:00:00 CEST 2021 and day of week 14 yields Sat Jun 05 00:00:00 CEST 2021
Wed Jun 02 00:00:00 CEST 2021 and day of week -14 yields Sat Jun 05 00:00:00 CEST 2021
Wed Jun 02 00:00:00 CEST 2021 and day of week -98 yields Sat Jun 05 00:00:00 CEST 2021
教程链接
Oracle tutorial: Date Time 解释如何使用 java.time。