Solución:
En lugar de agregando un número de días para wkstart
, usar with
nuevamente para configurar el día de la semana. Por ejemplo:
LocalDate date = LocalDate.now()
.with(WeekFields.ISO.weekBasedYear(), 2018) // year
.with(WeekFields.ISO.weekOfWeekBasedYear(), 51) // week of year
.with(WeekFields.ISO.dayOfWeek(), DayOfWeek.MONDAY.getValue()); // day of week
org.threeten.extra.YearWeek
La respuesta de Sweeper parece correcta. Pero hay una clase más especializada para esto.
Si realiza mucho trabajo con semanas de años basados en semanas según la definición de semana de ISO 8601, utilice la YearWeek
clase encontrada en el ThreeTen-Extra Biblioteca.
Determina la semana.
YearWeek yearWeek = YearWeek.of( 2019 , 51 ) ;
Obtener una LocalDate
para el día de la semana dentro de esa semana.
LocalDate localDate = yearWeek.atDay( DayOfWeek.MONDAY ) ;
Para el día de la semana, debe usar DayOfWeek
enum objetos en su código en lugar de meros números enteros. Conseguir un DayOfWeek
desde un número original del 1 al 7 de lunes a domingo, llame DayOfWeek.of( x )
.
DayOfWeek dow = DayOfWeek.of( 1 ) ; // 1 = Monday, 7 = Sunday.
Poniendo todo eso junto, obtenemos este resumen.
LocalDate localDate =
YearWeek // Represent an entire week of a week-based year per the ISO 8601 standard definition of a week.
.of( // Instantiate a `YearWeek` object.
2019 , // Specify the week-based year number, NOT the calendar year.
51 // Specify the week number, 1-52 or 1-53.
)
.atDay(
DayOfWeek.of( 1 ) // The value 1 yields a `DayOfWeek.MONDAY` object.
)
;
Para ser claros… La definición de ISO 8601 de una semana es:
- La semana # 1 contiene el primer jueves del año.
- Las semanas comienzan en lunes y terminan en domingo.
- Un año tiene 52 o 53 semanas completas de 7 días.
- Las primeras / últimas semanas del año basado en semanas pueden contener los días anteriores / anteriores del año calendario anterior / siguiente. Por lo tanto, el año calendario de esos días difiere del año basado en semanas.