ТЛ; др
int iso8601WeekNumber =
ZonedDateTime.now( ZoneId.of ( "America/Montreal" ) )
.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR )
Множество определений недели
Есть много определений недели.
Для некоторых людей первый день недели - воскресенье, для других - понедельник, а для некоторых - другой день.
Для некоторых людей первая неделя года содержит 1 января, в то время как другие люди считают первую неделю той, которая содержит день начала недели, упомянутый выше, в то время как другие считают первую неделю как определенную дату дня. -неделю.
Так что никогда не следует понимать значение «недели» или «номера недели» без изучения документации.
Избегайте устаревших классов даты и времени
В общем, вам следует избегать старых устаревших классов даты и времени, связанных с ранними версиями Java, поскольку они плохо спроектированы, сбивают с толку и создают проблемы.
Здесь, в частности, класс java.util.Calendar
имеет определение недели, которое варьируется в зависимости от локали. Так что не используйте это, если вам нужны надежные постоянные результаты.
ISO 8601
Стандарт ISO 8601 определяет форматы и связанные с ними вопросы для значений даты и времени. специально определяет значение недели и недели года:
- Неделя начинается с понедельника по воскресенье с номерами 1-7, где понедельник = 1.
- Неделя № 1 содержит первый четверг года, дающий 52 или 53 недели в год.
Joda-Time
Библиотека Joda-Time использует стандартное определение недели и недели года ISO 8601 .
Однако имейте в виду, что проект Joda-Time теперь находится в режиме обслуживания , и команда рекомендует перейти на java.time.
java.time
В классах java.time используется определение недели: ISO 8601 : неделя № 1 имеет первый четверг, а неделя - понедельник-воскресенье.
Класс IsoFields
определяет недельный год. Мы можем попросить:
Сначала мы получаем текущую дату и время.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
Опросить этот объект даты-времени, спрашивая о стандартном недельном году.
int week = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
int weekYear = now.get ( IsoFields.WEEK_BASED_YEAR );
Дамп на консоль.
System.out.println ( "now: " + now + " is week: " + week + " of weekYear: " + weekYear );
сейчас: 2016-01-17T20: 55: 27.263-05: 00 [Америка / Монреаль] - неделя: 2 неделиГод: 2016
Для получения дополнительной информации см. Аналогичный вопрос: Как вычислить дату из номера недели ISO8601 в Java .
WeekFields
В java.time вы также можете вызвать класс WeekFields
, например, WeekFields.ISO.weekBasedYear()
. Должен иметь тот же эффект, что и IsoFields
в более поздних версиях Java 8 или новее (некоторые ошибки были исправлены в более ранних версиях Java 8).
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
.
Проект Joda-Time , который теперь находится в режиме обслуживания , рекомендует выполнить переход на java.time.
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация 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 .