Por lo que solo puedo suponer que es un problema de zona horaria, el siguiente código produce diferentes valores de semana del año para el mismo día, pero en diferentes momentos:
Tenga en cuenta que el código está escrito en Kotlin
Ejemplo
fun main(args: Array<String>) { val middaySundayAfterEpoch = Instant.EPOCH + Duration .ZERO .plusDays(3) .plusHours(12) val almostMidnightSundayAfterEpoch = Instant.EPOCH + Duration .ZERO .plusDays(3) .plusHours(23) println(getWeekOfYear(middaySundayAfterEpoch)) println(getWeekOfYear(almostMidnightSundayAfterEpoch)) } fun getWeekOfYear(instant: Instant): Int { val calendar: Calendar = Calendar.getInstance() calendar.time = Date.from(instant) return calendar.get(Calendar.WEEK_OF_YEAR) }Resultados
1
2
suposiciones
Pregunta
¿Cómo modifico esto para ignorar la zona horaria, de modo que ambas horas ocurran en la misma semana?
Nunca debe usar el legado java.util.Date y java.util.Calendar si puede evitarlos, siendo esta una de las muchas razones.
El objeto ZonedDateTime proporciona una forma de obtener esto:
instant.atZone(ZoneId.of("UTC")).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR) EDITAR: una versión anterior de esta respuesta usó la hora predeterminada del sistema, así como ChronoUnit.ALIGNED_WEEK_OF_YEAR . Esto considera del 1 al 7 de enero como la "semana 1" del año, independientemente del día de la semana del 1 de enero en un año en particular. Sin embargo, se basará en la parte de fecha de ZonedDateTime .