ТЛ; др
YearWeek.of( 2016 , 1 )
.atDay( DayOfWeek.MONDAY )
2016-01-04
Год-неделя не дата
Строго говоря, вы не можете получить дату из года и номер недели. Но я продолжу, если вы хотите получить первый день недели для любого года и номера недели.
Использование java.time
Современный подход к классам java.time, которые вытесняют проблемные старые унаследованные классы даты и времени.
Класс WeekFields
дает вам возможность работать с неделей года.
Locale
определенные недели
Существует много определений недели года. В этом примере кода используется текущее значение по умолчанию JVM Locale
для определения определения.
int year = 2016;
int week = 1;
int dayOfWeek = 1; // 1-7, locale-dependent such as Sunday-Monday in US.
WeekFields weekFields = WeekFields.of ( Locale.CANADA_FRENCH );
LocalDate ld = LocalDate.now ( )
.withYear ( year )
.with ( weekFields.weekOfYear ( ), week )
.with ( weekFields.dayOfWeek ( ), 1 );
System.out.println ( "ld: " + ld );
Обратите внимание, что в этом определении недель первый день недели в начале года (2016) фактически является днем ближе к концу предыдущего года (2015).
2015-12-27
ISO 8601 стандартная неделя
Ваш бизнес может выбрать принятие стандартных ISO 8601 недель. В этой простой схеме неделя № 1 содержит первый четверг календарного года, а неделя длится с понедельника по воскресенье. В году 52 или 53 недели.
Тот же код, что и выше, но мы отключаем зависящий от локали объект WeekFields
с постоянной, определенной ISO, WeekFields.ISO
. Но мы получаем совсем другой результат, 2016-01-04
, а не 2015-12-27
.
int year = 2016;
int week = 1;
int dayOfWeek = 1; // 1-7, locale-dependent such as Sunday-Monday in US.
WeekFields weekFields = WeekFields.ISO;
LocalDate ld = LocalDate.now ( )
.withYear ( year )
.with ( weekFields.weekOfYear ( ), week )
.with ( weekFields.dayOfWeek ( ), 1 );
System.out.println ( "ld: " + ld );
* * 2016-01-04 тысяча сорок-девять
YearWeek
Эта работа будет проще, если вы добавите библиотеку ThreeTen-Extra в свой проект. Вы можете использовать класс YearWeek
для стандартных недель ISO 8601.
Не путайте номер календарного года с номером года в году.
YearWeek yw = YearWeek.of( 2016 , 1 ); // Passing a week-based-year number, *NOT* a calendar year.
Метод toString
создает строку в стандартном формате ISO 8601 yyyy-Www
, например 2016-W01
.
Чтобы получить определенную дату, укажите день недели, используя перечисляемые в Java объекты DayOfWeek
.
LocalDate ld = yw.atDay( DayOfWeek.MONDAY );
Вы можете спросить, есть ли в недельном году 52 или 53 недели.
int weeksInWeekBasedYear = yw.lengthOfYear();
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы заменяют проблемные старые унаследованные классы даты и времени, такие как java.util.Date
, Calendar
, & 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 .