TL; др
accepted Answer by Hendrickx является правильным. Вот альтернатива, которую я считаю немного более читаемой.
LocalDate.of(2017 , Month.JANUARY , 1)
.with(TemporalAdjusters.previous(DayOfWeek.MONDAY))
TemporalAdjuster
Интерфейс TemporalAdjuster
обеспечивает классы, которые манипулируют объекты java.time. Реализации можно найти в классе TemporalAdjusters
. Регулятор previousOrSame
обнаруживает предыдущее появление дня недели или палочки с той же датой, если это уже тот день недели.
LocalDate target = LocalDate.of(2017 , Month.JANUARY , 1);
LocalDate ld = target.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
target.toString(): 2017-01-01 | ld.toString(): 2016-12-26
Если вы хотите всегда предыдущий понедельник, даже если дата уже понедельник, а затем использовать регулятор previous
.
LocalDate ld = target.with(TemporalAdjusters.previous(DayOfWeek.MONDAY));
Чтобы получить конец недели, используйте nextOrSame
регулятор.
LocalDate nextOrSameSunday = target.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
Вы можете увидеть день недели в строке.
ZoneId z = ZoneId.of("America/Montreal");
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(Locale.CANADA);
System.out.println("target: " + target.format(f) + " | ld: " + ld.format(f));
цель: Воскресенье, 1 Январь 2017 | ld: Понедельник, 26 декабря 2016 года
См. это code live in IdeOne.com.
Также обратите внимание на использование enums, DayOfWeek
и Month
. См. Tutorials.
О java.time
java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.
Где получить классы java.time?
- Java SE 8 и SE 9, а затем
- Встроенный.
- Часть стандартного Java API с объединенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
- Android
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more.
Почему вы верите 'first.getFirstDayOfWeek() - first.get (Calendar.DAY_OF_WEEK)' - это способ адаптации к началу недели? Когда firstDayOfWeek равно 2 (MONDAY), а dayOfWeek равно 1 (SUNDAY), вы получаете '2 - 1 = + 1', т. Е. Вы * добавляете * 1 день. Это то, что вы видите.Я оставлю это вам, чтобы выяснить, как настроить эту логику, чтобы исправить проблему. BTW: Просто печать этих значений сказала бы вам об этом. – Andreas
Проблема не из-за изменения года. Ваше понимание чисел DayOfWeek неверно. Даже если вы установите FirstDayOfWeek в понедельник, число понедельников равно 2, а число DayOfWeek с 1 января 2017 года - воскресенье/1. Итак, 2-1 = 1 и 1 января 2017 года +1 = 2 января 2017. И 2 января 2017 года + 6 = 8 января 2017 года. Таким образом, все работает так, как ожидалось. –
Хорошо спасибо за помощь, я буду использовать API Joda Time, потому что он лучше реализован для моих конкретных проблем. – Tuby