Почему java.util.Calendar возвращает минимальное значение WEEK_OF_MONTH как ноль? - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь установить минимальное значение поля WEEK_OF_MONTH следующим образом:

calendar.set(WEEK_OF_MONTH, calendar.getActualMinimum(WEEK_OF_MONTH));

Вызов

calendar.getActualMinimum(WEEK_OF_MONTH)

возвращает 0

Но при расчете во времяОперации get * это поле становится равным 5. Более того, без режима снисхождения я получаю

java.lang.IllegalArgumentException: WEEK_OF_MONTH: 0 -> 5 // or MONTH: 9 -> 8
    at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2829)
    at java.util.Calendar.updateTime(Calendar.java:3393)
    at java.util.Calendar.complete(Calendar.java:2265)
    at java.util.Calendar.get(Calendar.java:1826)
    at Main.main(Main.java:19)

Если я установлю WEEK_OF_MONTH = 1, тогда я получу его правильно как 1.

Проверьте пример

Кто-нибудь может прояснить такое поведение?Заранее спасибо.

1 Ответ

0 голосов
/ 12 октября 2018

java.time

    Locale russia = Locale.forLanguageTag("ru-RU");
    WeekFields wf = WeekFields.of(russia);

    LocalDate date = LocalDate.now(ZoneId.of("Europe/Moscow"));
    int minimumWeekOfMonth = date.with(TemporalAdjusters.firstDayOfMonth()).get(wf.weekOfMonth());
    System.out.println("Minimum week of month: " + minimumWeekOfMonth);
    LocalDate dateInFirstWeekOfMonth = date.with(wf.weekOfMonth(), minimumWeekOfMonth);
    System.out.println("Date in first week of month: " + dateInFirstWeekOfMonth);

При запуске этого фрагмента прямо сейчас я получил следующий вывод:

Minimum week of month: 1
Date in first week of month: 2018-10-05

Я предположил, что вы находитесь на русском языке.В России используется международная нумерация недель, где понедельник - первый день недели, а первая неделя года или месяца - первая неделя, содержащая не менее 4 дней в году или месяце.Таким образом, неделя 1 октября 2018 года была с понедельника 1 октября по воскресенье 7 октября. Это, в свою очередь, означает, что минимальная неделя в этом месяце равна 1. Начиная с сегодняшнего дня (пятница) и устанавливая неделю месяца равной 1, вы получаете пятницу в неделе.1, то есть пятница 5 октября.

Если я начну со среды 12 сентября, вместо этого я получу:

Minimum week of month: 0
Date in first week of month: 2018-08-29

Неделя 1 сентября была с понедельника с 3 по 9 сентября.означает, что 1 и 2 сентября были на неделе 0, поэтому 0 - минимальная неделя месяца для сентября.И когда я начинаю со среды, я устанавливаю номер недели равным 0, я получаю среду этой недели, которая оказывается в августе: 29 августа. Если мы спросим неделю месяца с этой датой, получим ли мы 0?

    System.out.println("Week of month: " + dateInFirstWeekOfMonth.get(wf.weekOfMonth()));

Вывод:

Week of month: 5

Поскольку дата в августе, мы теперь получаем, в какой неделе августа находится дата, а это неделя 5.

Что произошло в вашем коде?

Мне кажется, что GregorianCalendar.getActualMinimum(Calendar.WEEK_OF_MONTH) всегда возвращает 0. Я не могу понять это наблюдение.Поскольку в России используется григорианский календарь, экземпляр GregorianCalendar - это то, что вы действительно получаете от Calendar.getInstance.

Я бы не хотел беспокоиться.Как я уже сказал в комментарии, класс Calendar давно устарел и имеет ряд проблем с дизайном, поэтому я не рекомендую его использовать.Я бы, конечно, предпочел java.time, современный Java-интерфейс даты и времени, в любое время.

Ссылка

Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time.

...