java.time
我建议您使用现代 Java 日期和时间 API java.time 进行日期工作。它已经有一个与您类似的内置DayOfWeek 枚举(仅以MONDAY 开头,符合国际标准)。使用哪个类而不是旧的 Calendar 取决于您的确切要求。例如,对于没有时间的一天,请使用 LocalDate。对于特定时区的日期和时间,请使用ZonedDateTime。这是一个使用LocalDate的代码示例:
DayOfWeek givenDow = DayOfWeek.TUESDAY; // java.time DayOfWeek
LocalDate date = LocalDate.of(2020, Month.JUNE, 2);
DayOfWeek dowOfDate = date.getDayOfWeek();
if (dowOfDate.equals(givenDow)) {
System.out.println("Yes, it’s a Tuesday");
} else {
System.out.println("No, it’s a " + dowOfDate);
}
输出是:
是的,今天是星期二
我确实考虑过您是否希望通过比较来告诉您日期是在星期二之前还是之后,但由于星期二每周都会到来,因此对于大多数目的而言,我认为它没有多大意义。让我知道它是否适合你。
您是否想使用equals() 或== 来比较枚举值始终是个问题。两者都有效,因为编译器确保每个枚举常量都是单例。在 Stack Overflow 上,我倾向于使用 equals(),因为它通常被推荐用于比较对象的相等性,而在非枚举对象之间使用 == 的人可能会遇到令人不快的意外。我工作的项目标准说使用== 来比较枚举值。
如果您从旧 API 获得了一个 GregorianCalendar 对象,而您现在无法升级到 java.time,您可以转换为 ZonedDateTime 并将其星期几作为 java.time 枚举常量:
GregorianCalendar oldfashionedCalendar
= new GregorianCalendar(2020, Calendar.JUNE, 3);
DayOfWeek dowOfCalendar = oldfashionedCalendar.toZonedDateTime().getDayOfWeek();
其余的和以前一样。到目前为止,您所拥有的 Calendar 很可能是 GregorianCalendar,如果是这样,您可以将其转换为一个。
转换为日历
我不知道它有什么意义,但当然DayOfWeek 值可以转换为老式的Calendar。我们需要决定我们希望所有其他 Calendar 字段是什么。这是一个例子:
DayOfWeek givenDow = DayOfWeek.TUESDAY;
ZonedDateTime startOfDay = LocalDate.EPOCH
.with(givenDow)
.atStartOfDay(ZoneId.systemDefault());
Calendar oldfashionedCalendar = GregorianCalendar.from(startOfDay);
System.out.println(oldfashionedCalendar.getTime());
1969 年 12 月 30 日星期二 00:00:00 CET
所以我们按照要求安排了一个星期二。
使用您的 Hybris 枚举
如果您坚持使用自己的枚举,我们也可以对其进行转换。要转换为 java.time 枚举,我们需要考虑到您的枚举首先是星期日,而 java.time 是最后一个:
DaysOfWeek givenDow = DaysOfWeek.TUESDAY; // Your Hybris DaysOfWeek
DayOfWeek javaDow;
if (givenDow.equals(DaysOfWeek.SUNDAY)) {
javaDow = DayOfWeek.SUNDAY;
} else {
// The ordinal of Hybris DaysOfWeek for Monday through Saturday are 1 through 6,
// which agrees with Java DayOfWeek numbering
javaDow = DayOfWeek.of(givenDow.ordinal());
}
System.out.println("As java.time DayOfWeek: " + javaDow);
作为 java.time DayOfWeek:星期二
要将其转换为可以与Calendar 进行有意义比较的东西,我们需要在序数上加 1,因为Calendar 从 1 开始编号。周日没有问题,它在 DaysOfWeek 和Calendar.
int givenCalendarDow = givenDow.ordinal() + 1;
GregorianCalendar oldfashionedCalendar
= new GregorianCalendar(2020, Calendar.JUNE, 9);
int dowOfCalendar = oldfashionedCalendar.get(Calendar.DAY_OF_WEEK);
if (dowOfCalendar == givenCalendarDow) {
System.out.println("Yes, it’s a Tuesday");
} else {
System.out.println("No, it’s a " + dowOfCalendar);
}
是的,今天是星期二
链接
Oracle tutorial: Date Time 解释如何使用 java.time。