Получить номер недели LocalDate (Java 8)

Я пытаюсь получить номер недели полной LocalDate в формате:

dd.MM.yyy

Я не нашел функцию в Java 8 Date API, которая возвращает номер недели, и я попытался создать алгоритм, но это не сработало.


person YvesHendseth    schedule 24.09.2014    source источник


Ответы (2)


Одно маленькое предупреждение. Я еще не тестировал это, но просматриваю документацию API WeekFields и LocalDate.get, вы должны сделать что-то вроде:

LocalDate date = ...;
// Or use a specific locale, or configure your own rules
WeekFields weekFields = WeekFields.of(Locale.getDefault()); 
int weekNumber = date.get(weekFields.weekOfWeekBasedYear());
person Mark Rotteveel    schedule 24.09.2014
comment
Будьте осторожны с Locale.getDefault(). В некоторых местах (например, в Канаде) он может возвращать неделю, которая начинается в воскресенье. Используйте Locale.ISO в течение нескольких недель, начиная с понедельника. - person Leo Ufimtsev; 24.01.2016
comment
Locale.ISO нет, но есть WeekFields.ISO - person Michael Piefel; 10.04.2017
comment
Это очень важно заметить. Вероятно, вы хотите иметь WeekFields.ISO! - person membersound; 11.09.2019
comment
@membersound Это зависит от того, хотите ли вы использовать определение ISO или хотите правило, общее для вашей локали. - person Mark Rotteveel; 11.09.2019
comment
Действительно, я не знал, что, например, в США первый день часто бывает Sunday. Тем не менее, если вы разрабатываете приложение для европейских клиентов, а локальное значение по умолчанию в вашей системе равно en_US (что часто имеет место для разработчиков!), то ваш результат будет отличаться от ожидаемого, если вы этого не заметили. - person membersound; 11.09.2019
comment
Здесь одно сомнение. Как получить номер недели в 2 буквы. вар dateRangeFrom = 20200101 ; var weekFields:WeekFields = WeekFields.of(Locale.getDefault()); Это даст результат как Int = 1. Но я хочу, чтобы Int = 01. - person abc_spark; 06.04.2020
comment
@abc_spark Целые числа никогда не дополняются. Это проблема презентации, которую вы должны обрабатывать с помощью подходящего средства форматирования, например, см. Как дополнить целое число нулями слева? и другие вопросы о переполнении стека. - person Mark Rotteveel; 06.04.2020
comment
@Отметка. Я. Это правильно. Спасибо за это. - person abc_spark; 06.04.2020

Ответ Марка Роттевила почти правильный и снова пример того, какой потенциал путаницы существует в классе WeekFields (аналогично звучащие имена методов, но отличающиеся от интуитивного гражданского использования). Для правильного кода требуется еще одно поле:

LocalDate date = LocalDate.now();
TemporalField woy = WeekFields.of(Locale.getDefault()).weekOfWeekBasedYear(); 
int weekNumber = date.get(woy);

См. также аналогичные дебаты в этом SO-post, особенно обсуждение и комментарии по поводу ответа @kleopatra.

person Meno Hochschild    schedule 24.09.2014
comment
Я обновил свой ответ на основе вашего. У меня не было здесь доступа к Java 8, поэтому мне пришлось гадать (и, похоже, я не читал WeekFields внимательно изучите документацию класса, так как она объясняет эту разницу. - person Mark Rotteveel; 24.09.2014
comment
@MarkRotteveel Хорошо, теперь у вас есть мой голос ;-) Для меня название weekOfWeekBasedYear слишком техническое и по-прежнему раздражает. Даже документ ISO-8601 не содержит этого термина (в нем используются только такие термины, как календарная неделя или дата недели). - person Meno Hochschild; 24.09.2014
comment
Будьте осторожны с Locale.getDefault(). В некоторых местах (например, в Канаде) он может возвращать неделю, которая начинается в воскресенье. Используйте Locale.ISO в течение нескольких недель, начиная с понедельника. - person Leo Ufimtsev; 24.01.2016
comment
Locale.ISO нет, но есть WeekFields.ISO - person Michael Piefel; 10.04.2017