如何从 Hybris 枚举类型转换为 Java 日历?

How to convert from a Hybris enumtype to a Java Calendar?

在 Hybris 中,我创建了一个 枚举 星期几。

这是我的代码:

public enum DaysOfWeek implements HybrisEnumValue
{
    SUNDAY("SUNDAY"),
    MONDAY("MONDAY"),
    TUESDAY("TUESDAY"),
    WEDNESDAY("WEDNESDAY"),
    THURSDAY("THURSDAY"),
    FRIDAY("FRIDAY"),
    SATURDAY("SATURDAY");
}

如何将此枚举转换为 Java 中的日历,以便我可以比较 Hybris 枚举Java日历 个值?

java.time

我建议您使用 java.time,现代 Java 日期和时间 API,用于约会工作。它已经有一个类似于您的内置 DayOfWeek 枚举(仅以符合国际标准的 MONDAY 开头)。使用哪个 class 代替旧的 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);
    }

输出为:

Yes, it’s a Tuesday

我确实想过你是否想要一个比较来告诉你日期是在星期二之前还是之后,但由于每周星期二都是星期二,所以我觉得它对大多数用途来说意义不大。让我知道它是否适合您。

始终是要使用 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());

Tue Dec 30 00:00:00 CET 1969

所以我们按照要求安排了星期二。

使用您的 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);

As java.time DayOfWeek: TUESDAY

要将其转换为可以与 Calendar 进行有意义比较的内容,我们需要将序数加 1,因为 Calendar 从 1 开始对天数进行编号。星期日没有问题,它排在第一位DaysOfWeekCalendar.

    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);
    }

Yes, it’s a Tuesday

Link

Oracle tutorial: Date Time 解释如何使用 java.time.

不幸的是,Hybris 没有用于此类转换的 OOTB 服务/实用程序。如果您查看 OOTB de.hybris.platform.servicelayer.cronjob.impl.DefaultTriggerService,它有一个 DAYS_OF_WEEK_MAP 哈希图来处理此问题。

您可以创建自己的服务/实用程序来执行类似的操作。这是我想到的,从 Hybris 枚举转换为 Calendar int(一周),或者从 Calendar 对象或 int 转换为 Hybris 枚举。您或许可以调整它以变得更加灵活。

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));
    }
}