tl; dr
java.time.LocalDate.parse(
"31/12/2010" ,
DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.UK )
)
.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR )
52
Или добавьте библиотеку, а затем…
org.threeten.extra.YearWeek.from( // Convert from a `LocalDate` object to a `YearWeek` object representing the entire week of that date’s week-based year.
java.time.LocalDate.parse( "31/12/2010" , DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.UK )
).getWeek() // Extract an integer number of that week of week-based-year, either 1-52 or 1-53 depending on the year.
52
java.time
Как уже отмечалось, определение недели варьируется на Locale
в старом java.util.Calendar
классе.
Этот проблемный класс и его партнер java.util.Date
были вытеснены фреймворком java.time , встроенным в Java 8 и более поздние версии.
*Класс 1027 * определяет неделю с использованием стандарта ISO 8601 : неделя всегда начинается с понедельника, а неделя № 1 содержит первый четверг календарного года.
Получить текущий момент.
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 );
Определение стандартной недели
Существует многоспособы определения «недели» и «первой недели года».
Однако существует одно основное стандартное определение : стандарт ISO 8601 .Этот стандарт определяет недели года, включая первую неделю года.
неделя с первым четвергом года
Стандартные недели начинаются с понедельника и заканчиваются наВоскресенье.
Неделя № 1 в недельном году имеет первый четверг календарного года.
Классы java.time поддерживают неделю ISO 8601 в течение недели.IsoFields
класс, содержащий три константы, которые реализуют TemporalField
:
Позвоните LocalDate::get
для доступа к TemporalField
.
LocalDate ld = LocalDate.parse( "2010-12-31" ) ;
int weekOfWeekBasedYear = ld.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR ) ;
int yearOfWeekBasedYear = ld.get( IsoFields.WEEK_BASED_YEAR ) ;
ld.toString (): 2010-12-31
weekOfWeekBasedYear: 52
yearOfWeekBasedYear: 2010
Формат строки ISO 8601
Стандарт ISO 8601 определяет текстовый формат, а также значение для значений по неделям: yyyy-Www
.Для конкретной даты добавьте день недели с номером 1-7 для понедельника-воскресенья: yyyy-Www-d
.
Построить такую строку.
String outputWeek = String.format( "%04d" , yearOfWeekBasedYear ) + "-W" + String.format( "%02d" , weekOfWeekBasedYear ) ;
String outputDate = outputWeek + "-" + ld.getDayOfWeek().getValue() ;
2010-W52-5
YearWeek
Эта работа оченьпроще, если вы добавите библиотеку ThreeTen-Extra в ваш проект.Затем используйте класс YearWeek
.
YearWeek yw = YearWeek.from( ld ) ; // Determine ISO 8601 week of a `LocalDate`.
Создайте стандартную строку.
String output = yw.toString() ;
2010-W52
И разбор.
YearWeek yearWeek = YearWeek.parse( "2010-W52" ) ;
yearWeek.toString (): 2010-W52
Определить дату.Передайте объект перечисления java.time.DayOfWeek
для дня недели с понедельника по воскресенье.
LocalDate localDate = yw.atDay( DayOfWeek.MONDAY ) ;
localDate.toString (): 2010-12-27
IНастоятельно рекомендуем добавить эту библиотеку в ваш проект.Тогда вы можете передавать умные объекты, а не тупые целые.Это делает ваш код более самодокументируемым, обеспечивает безопасность типов и обеспечивает допустимые значения.
About java.time
Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые старые классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Используя драйвер JDBC , совместимый с JDBC 4.2 или более поздней версией, вы можете обменять java.time объекты непосредственно с вашей базой данных.Нет необходимости ни в строках, ни в java.sql. * Классах.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .
Более подробно см. мой ответ на аналогичный вопрос:
… и см. мой ответ на аналогичный вопрос: