【问题标题】:How to convert from a Hybris enumtype to a Java Calendar?如何从 Hybris 枚举类型转换为 Java 日历?
【发布时间】:2020-05-31 01:29:32
【问题描述】:

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

这是我的代码:

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

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

【问题讨论】:

  • 我建议你既不要使用Calendar,也不要使用你自己的枚举。 Calendar 设计不佳且早已过时。使用 java.time,现代 Java 日期和时间 API。它有一个与你类似的内置 DayOfWeek 枚举。
  • 您想到了哪个比较?如果您将TUESDAY(例如)的枚举值转换为也代表某个星期二的Calendar 对象,它很可能不等于您现有的也代表某个星期二的Calendar,并且您不知道哪个是早是晚。那么什么比较有意义呢?
  • 提供HybrisEnumValue 的文档链接。我在 SAP 网站上找不到可靠的文档,仅在 this 等页面上找到部分信息。并详细说明您想要什么 - 您的问题不清楚。
  • @BasilBourque 这是正确的参考。 Hybris 枚举不是手动创建的(通过创建 Java 文件)。 Hybris 枚举在 XML 文件中定义,其 Java 文件/类在构建期间自动生成。 (他正在展示自动生成的 Java 枚举的一部分)。此外,许多 Hybris API 使用日历类。因此,较新的 Java 8 日期/时间 API 不相关。
  • 感谢@geffchang,您的富有洞察力的评论。不过,我不能同意 较新的 Java 8 日期/时间 API 不相关。正如我在回答中所展示的那样,存在与现代 ZonedDateTime 的轻松转换。我更愿意随时使用它们。

标签: java calendar type-conversion enumeration hybris


【解决方案1】:

很遗憾,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));
    }
}

【讨论】:

    【解决方案2】:

    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 开始编号。周日没有问题,它在 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);
        }
    

    是的,今天是星期二

    链接

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 1970-01-01
      相关资源
      最近更新 更多