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
.