将日历集 DAY_OF_WEEK 转换为使用 TemporalAdjusters

Convert Calendar set DAY_OF_WEEK to use TemporalAdjusters

我有一些这样的遗留代码

        final Calendar cal = new GregorianCalendar();
        cal.setTime(today);
        // changed on May-03-2004
        //cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
        if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
            cal.add(Calendar.DAY_OF_YEAR, -6);
        } else {
            cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        }
        //System.out.println("Begin of cycle: " + cal.getTime());

我想将其转换为使用 java.time TemporalAdjuster class 以希望使其更具可读性。

但我不太确定如何解释 以使行为匹配。

https://repl.it/@trajano/setCal

中试玩并尝试不同的组合后确定

代码转换为

  public static LocalDate doIt(LocalDate todayDate) {
    final LocalDate c2;
    if (todayDate.getDayOfWeek() == DayOfWeek.SUNDAY) {
      c2 = todayDate.minusDays(6);
    } else {
      c2 = todayDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
    }
    return c2;

  }

假设 today 确实是今天的日期,那么使用 TemporalAdjusters 的 Java 时间 API 版本将是:

LocalDate today = LocalDate.now();

TemporalAdjuster adjuster = TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY);
LocalDate monday = today.with(adjuster);

System.out.println(today + " -> " + monday);

示例输出

2020-02-01 -> 2020-01-27

2020-02-01是星期六,2020-01-27是前一个星期一。

DayOfWeek 实现 TemporalAdjuster

我认为您的代码试图将 Calendar 对象设置为同一 ISO 周的星期一,也就是说,如果今天还不是星期一,则为今天之前的星期一(这并不总是结果不过在所有语言环境中)。当你知道怎么做时,这真的很简单。

    LocalDate today = LocalDate.of(2020, Month.FEBRUARY, 2);
    LocalDate monday = today.with(DayOfWeek.MONDAY);
    System.out.println("Monday of the same week is " + monday + ", a " + monday.getDayOfWeek());

此片段的输出是:

Monday of the same week is 2020-01-27, a MONDAY

LocalDate 始终使用 ISO 日历,其中星期一是一周的第一天,因此 today.with(DayOfWeek.MONDAY) 为您提供同一周的星期一,换句话说,就是前一个星期一今天还不是星期一。 GregorianCalendar 使用了默认区域设置的星期定义,这导致代码有点复杂,以确保它在星期日是一周的第一天的区域设置中也能正确运行。 LocalDate 在所有语言环境中的行为都相同,这是使用 LocalDate 的代码更简单的原因之一。