Я считаю, что другие ответы близки, но еще не совсем там.Насколько я понимаю, вы хотите использовать недельную схему локали по умолчанию, чего нет в других ответах.Мое предложение:
WeekFields wf = WeekFields.of(Locale.getDefault());
LocalDate today = LocalDate.now(ZoneId.of("Africa/Casablanca"));
int week = today.get(wf.weekOfYear());
int dow = today.get(wf.dayOfWeek());
System.out.println("Today is " + today + ", "
+ today.getDayOfWeek() + " of week " + week);
LocalDate correspondingDayLastYear = today.minusYears(1)
.with(wf.weekOfYear(), week)
.with(wf.dayOfWeek(), dow);
System.out.println("Last year was " + correspondingDayLastYear + ", "
+ correspondingDayLastYear.getDayOfWeek()
+ " of week " + correspondingDayLastYear.get(wf.weekOfYear()));
При запуске на моем компьютере только сейчас вывод:
Today is 2019-06-30, SUNDAY of week 26
Last year was 2018-07-01, SUNDAY of week 26
Когда я устанавливаю свой язык в США, я получаю то же самоедата, но другой номер недели, так как американские недели определены по-разному:
Today is 2019-06-30, SUNDAY of week 27
Last year was 2018-07-01, SUNDAY of week 27
Я считаю, что также будут случаи, когда разные локали будут давать вам разные даты.
wf.dayOfWeek()
дает вам поле, которое нумерует дни от 1 до 7 в соответствии с первым днем недели в данном конкретном регионе.Важно не просто использовать withDayOfWeek
или его эквивалент, иначе вы рискуете перейти на другую неделю, если не будете использовать недели ISO.
Тем не менее мой ответ не всегда будет работать!Если сегодня 53 недели года, вполне может быть, что в прошлом году не было 53 недели. Мы мало что можем с этим поделать.Еще одна проблема, которую мы не можем решить: в американских неделях неделя 1 начинается 1 января. Если это воскресенье, то это первый день недели, но затем неделя 1 предыдущего года начиналась в пятницу или субботу, поэтому неделяУ меня не было воскресенья.