在Hybris中,我创建了一个 枚举 的天数。
这是我的代码。
public enum DaysOfWeek implements HybrisEnumValue
{
SUNDAY("SUNDAY"),
MONDAY("MONDAY"),
TUESDAY("TUESDAY"),
WEDNESDAY("WEDNESDAY"),
THURSDAY("THURSDAY"),
FRIDAY("FRIDAY"),
SATURDAY("SATURDAY");
}
我怎样才能在Java中把这个枚举转换为一个日历, 这样我就可以比较一下... Hybris枚举 和 Java日历 值?
不幸的是Hybris没有一个OOTB服务工具来进行这样的转换。如果你看一下 OOTB de.hybris.platform.servicelayer.cronjob.impl.DefaultTriggerService
它有一个 DAYS_OF_WEEK_MAP
hashmap来处理这个问题。
你也许可以创建自己的服务工具来做类似的事情。这是我想到的一些东西,从 Hybris enum 转换为 Calendar int (周),或者从 Calendar 对象或 int 转换为 Hybris enum。你也许可以调整它来变得更灵活。
enum HybrisDaysOfWeek implements HybrisEnumValue
{
SUNDAY("SUNDAY"),
MONDAY("MONDAY"),
TUESDAY("TUESDAY"),
WEDNESDAY("WEDNESDAY"),
THURSDAY("THURSDAY"),
FRIDAY("FRIDAY"),
SATURDAY("SATURDAY");
private final String code;
private HybrisDaysOfWeek(final String code)
{
this.code = code.intern();
}
public String getCode()
{
return this.code;
}
}
class CalendarUtil {
private CalendarUtil() {
// do not instantiate
}
public static final HybrisDaysOfWeek toHybrisDaysOfWeek(Calendar calendar) {
return HybrisDaysOfWeek.values()[calendar.get(Calendar.DAY_OF_WEEK) - 1];
}
public static final HybrisDaysOfWeek toHybrisDaysOfWeek(int dayOfWeek) {
return HybrisDaysOfWeek.values()[dayOfWeek - 1];
}
public static final int toCalendarDayOfWeek(HybrisDaysOfWeek week) {
return week.ordinal() + 1;
}
}
public class Demo {
public static void main(String[] args) {
System.out.println("### Calendar Object to Hybris:");
Calendar cal = Calendar.getInstance();
// Prints Sunday (Calendar value: 1)
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
System.out.println(CalendarUtil.toHybrisDaysOfWeek(cal));
// Prints Monday (Calendar value: 2)
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(CalendarUtil.toHybrisDaysOfWeek(cal));
// Prints Friday (Calendar value: 6)
cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
System.out.println(CalendarUtil.toHybrisDaysOfWeek(cal));
// Prints Saturday (Calendar value: 7)
cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
System.out.println(CalendarUtil.toHybrisDaysOfWeek(cal));
System.out.println("### Calendar int to Hybris:");
// Prints Sunday (Calendar value: 1)
System.out.println(CalendarUtil.toHybrisDaysOfWeek(Calendar.SUNDAY));
// Prints Monday (Calendar value: 2)
System.out.println(CalendarUtil.toHybrisDaysOfWeek(Calendar.MONDAY));
// Prints Friday (Calendar value: 6)
System.out.println(CalendarUtil.toHybrisDaysOfWeek(Calendar.FRIDAY));
// Prints Saturday (Calendar value: 7)
System.out.println(CalendarUtil.toHybrisDaysOfWeek(Calendar.SATURDAY));
System.out.println("### Hybris enum to Calendar int:");
// Prints 1
System.out.println(CalendarUtil.toCalendarDayOfWeek(HybrisDaysOfWeek.SUNDAY));
// Prints 2
System.out.println(CalendarUtil.toCalendarDayOfWeek(HybrisDaysOfWeek.MONDAY));
// Prints 6
System.out.println(CalendarUtil.toCalendarDayOfWeek(HybrisDaysOfWeek.FRIDAY));
// Prints 7
System.out.println(CalendarUtil.toCalendarDayOfWeek(HybrisDaysOfWeek.SATURDAY));
}
}
我建议你使用java.time,现代的Java日期和时间API,来完成你的日期工作。它已经有一个内置的 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()
因为它一般推荐用于比较对象的平等性,而有人在使用 ==
非枚举对象之间的风险是一个不愉快的惊喜。我工作的项目标准说要使用 ==
用于比较枚举值。
如果你有一个 GregorianCalendar
对象,而你现在还不能升级到java.time,你可以将其转换为 ZonedDateTime
并将其星期几作为java.time enum常量。
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());
星期二 12月30日 00:00:00 CET 1969年。
所以我们已经按照要求在周二进行了。
如果你坚持使用自己的枚举,我们也可以将其转换为java.time枚举。要转换为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);
As java.time DayOfWeek: TUESDAY
将其转换为你可以有意义地比较的东西。Calendar
我们需要在序数上加1,因为 Calendar
星期天没有问题,它在两个日期中都排在第一位。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);
}
是的,今天是星期二
甲骨文教程。日期时间 解释如何使用java.time。