Преобразовать календарь установить DAY_OF_WEEK для использования TemporalAdjusters - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть какой-то устаревший код, подобный этому

        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, чтобы, надеюсь, сделать его более читабельным.

Но я Я не совсем уверен, как интерпретировать { ссылка }, чтобы поведение соответствовало.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2020

Если предположить, что today действительно является сегодняшней датой, тогда версия API времени Java, использующая TemporalAdjusters, будет:

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 - предыдущий понедельник.

1 голос
/ 02 февраля 2020

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

Вывод этого фрагмента:

Понедельник той же недели 2020-01-27, ПОНЕДЕЛЬНИК

LocalDate всегда использует календарь ISO, в котором понедельник является первым днем ​​недели, поэтому today.with(DayOfWeek.MONDAY) дает вам понедельник той же недели, другими словами, предыдущий понедельник сегодня еще не понедельник. GregorianCalendar использовал определение недели для локали по умолчанию, что немного усложнило код, чтобы убедиться, что он также будет работать правильно в локалях, где воскресенье - первый день недели. LocalDate ведет себя одинаково во всех локалях, что является одной из причин, по которой код, использующий LocalDate, проще.

0 голосов
/ 02 февраля 2020

Хорошо, после игры и пробуя различные комбинации в 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;

  }
...