如何将 Hybris enumtype 转换为 Java Calendar?

问题描述 投票:0回答:1

在Hybris中,我创建了一个 枚举 的天数。

这是我的代码。

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

我怎样才能在Java中把这个枚举转换为一个日历, 这样我就可以比较一下... Hybris枚举Java日历 值?

java calendar type-conversion enumeration hybris
1个回答
2
投票

不幸的是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));
    }
}

1
投票

java.time

我建议你使用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年。

所以我们已经按照要求在周二进行了。

使用你的Hybris枚举

如果你坚持使用自己的枚举,我们也可以将其转换为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 星期天没有问题,它在两个日期中都排在第一位。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);
    }

是的,今天是星期二

链接

甲骨文教程。日期时间 解释如何使用java.time。

© www.soinside.com 2019 - 2024. All rights reserved.