Я понимаю ваше замешательство.Разница не в том, что методы withXx
работают иначе, чем TemporalAdjusters
.Разница:
- Первый день года и первый день месяца определены однозначно и поэтому их легко встроить в метод
withXx
или временный корректор. - Первый день недели отличается в зависимости от культуры.В некоторых местах неделя начинается в воскресенье или в другой день.Установка
ChronoField.DAY_OF_WEEK
в 1 устанавливает день недели в понедельник.Так что любой из методов withFirstDayOfWeek
или временного регулятора firstDayOfWeek
был бы опасен и дал бы некоторым пользователям удивительные результаты.
Если вы уверены, что хотите рассмотреть только неделю ISO, в котором понедельник является первым днем, inputZonedDateTime.with(ChronoField.DAY_OF_WEEK, 1)
подходит для ваших целей.В противном случае правильное решение - использовать объект WeekFields
и его временное поле dayOfWeek()
.Установка этого поля в 1 установит первый день недели в соответствии с определением недели, которое представляет объект WeekFields
.
Согласно Википедии:
- В большинстве случаевНа Ближнем Востоке неделя начинается в субботу.
- В Канаде, США, Индии, Японии, Тайване, Гонконге, Макао, Израиле, Египте, Южной Африке, на Филиппинах и в большинстве стран Латинской Америки она начинается в воскресенье..
- ЕС и большинство других европейских стран, большая часть Азии и Океании используют понедельник (в соответствии с ISO).
Я пытался принять во внимание это воскресеньеможет быть первым днем недели, например, в США.
Пример кода
// Don’t set default locale from production code, it’s for demonstration only
Locale.setDefault(Locale.forLanguageTag("ar-SD"));
WeekFields wf = WeekFields.of(Locale.getDefault());
DateTimeFormatter formatter = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM)
.withLocale(Locale.ENGLISH);
ZonedDateTime inputZonedDateTime
= ZonedDateTime.of(2019, 3, 3, 12, 0, 0, 0, ZoneId.of("Asia/Amman"));
ZonedDateTime flattenedDateTime = inputZonedDateTime.with(wf.dayOfWeek(), 1);
System.out.println("First day of week in "
+ Locale.getDefault().getDisplayCountry(Locale.ENGLISH)
+ " is " + flattenedDateTime.format(formatter));
Первый день недели в Судане - суббота, 2 марта 2019 г., 12:00:00 PM
Конечно, вы можете получить правильную локаль для WeekFields.of
другим способом.Выходные данные с несколькими другими языковыми стандартами включают:
- es-PY:
Первый день недели в Парагвае - воскресенье, 3 марта 2019 года, 12:00:00 PM
- мг-мг:
Первый день недели на Мадагаскаре - понедельник, 25 февраля 2019 года, 12:00:00
Ссылка: Статья в Википедии: неделя