如何从两个 DayOfWeeks 之间获取 DayOfWeeks 列表

How to get List of DayOfWeek from between two DayOfWeeks

我想获取两个 DayOfWeeks 之间的 DayOfWeeks 列表。

例如,

Input1: DayOfWeek.MONDAY
Input2: DayOfWeek.WEDNESDAY

并且输出应该是列表

[DayOfWeek.MONDAY, DayOfWeek.TUESDAY,
DayOfWeek.WEDNESDAY]

Java 是否提供任何 Api 来实现这一目标?

这是实现它的一种方法。可能有更好的方法。您创建一个整数值流,其中开始是第一天,最后一天是最后一天 + 1。然后根据日期值映射 DayOfWeek 对象。

        DayOfWeek monday = DayOfWeek.MONDAY;

        DayOfWeek wednesday = DayOfWeek.WEDNESDAY;

        List<DayOfWeek> days = IntStream.range(monday.getValue(), wednesday.getValue() + 1)
                .mapToObj(DayOfWeek::of)
                .collect(Collectors.toList());

输出

[MONDAY, TUESDAY, WEDNESDAY]

您可以使用 DayOfWeek.values() 获取天数,然后使用 filter 过滤 MONDAYWEDNESDAY

之间的天数
List<DayOfWeek> days = Arrays.stream(DayOfWeek.values())
            .filter(day -> day.getValue() >= DayOfWeek.MONDAY.getValue()
                    && day.getValue() <= DayOfWeek.WEDNESDAY.getValue())
            .collect(Collectors.toList());

    System.out.println(days);

tl;博士

EnumSet.range( DayOfWeek.MONDAY, DayOfWeek.WEDNESDAY )

EnumSet.range

EnumSet is an implementation of Set 针对枚举对象进行了优化。

EnumSet.range creates a subset of the enum’s objects in the order of their definition. For DayOfWeek, that order is Monday-Sunday, per the ISO 8601标准。

范围是全封闭的,意思是开始和结束都包括在内。

Set<DayOfWeek> set = EnumSet.range( DayOfWeek.MONDAY, DayOfWeek.WEDNESDAY );

set.toString(): [MONDAY, TUESDAY, WEDNESDAY]

如果您的问题域使用不同于周一至周日的日期顺序,请参阅

如果您确实需要 List 而不是 Set,请转换。将该集合提供给 List 实现的构造函数,例如 ArrayList.

List< DayOfWeek > dows = new ArrayList<>( set );

跨越周界

其他答案很好(我特别喜欢 Basil Bourque 的 ). They all seem to presuppose (1) that your two input days are in the same week, and (2) that the week begins on Monday as the DayOfWeek 枚举。现在如果输入是星期五和星期一,我们不想要 星期五、星期六、星期日、星期一吗? ?如果美国用户希望星期日和星期二得到 星期日、星期一、星期二,那该怎么办?星期日是那里一周的第一天(在其他一些国家还有地方)。

我认为考虑到这些可能性,没有比经典循环更好的解决方案了。

    DayOfWeek input1 = DayOfWeek.FRIDAY;
    DayOfWeek input2 = DayOfWeek.MONDAY;

    List<DayOfWeek> range = new ArrayList<>(7);
    DayOfWeek currentDow = input1;
    range.add(currentDow);
    while (! currentDow.equals(input2)) {
        currentDow = currentDow.plus(1);
        range.add(currentDow);
    }

    System.out.println(range);

输出:

[FRIDAY, SATURDAY, SUNDAY, MONDAY]

由于我使用的是列表而不是集合,所以日子是有序的。幸运的是 plus method has cyclic overflow: SUNDAY.plus(1) yields MONDAY,第一个枚举成员。

没有跨越周界

如果要求您进入下一周(从周日到周一),您应该检查您的输入是否满足要求,然后使用其中一个其他答案。示例检查:

    if (input1.getValue() > input2.getValue()) {
        throw new IllegalStateException("Inputs muct be in chronological order within the same Monday-based week");
    }