Por lo que sólo puedo suponer es un problema de zona horaria, el siguiente código produce diferentes semana de los valores del año para el mismo día, pero diferentes momentos:
Tenga en cuenta, 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
supuestos
- Domingo, 12:00 es en realidad domingo, 13:00 horas en el calendario
- Domingo, 23:00 es en realidad lunes 00:00 en el calendario
Pregunta
¿Cómo puedo modificar esto para ignorar la zona horaria, por lo que en ambas ocasiones se producen en la misma semana?
Nunca se debe usar el legado java.util.Date
y java.util.Calendar
si puedes evitarlos, siendo esta una de las muchas razones.
El ZonedDateTime
objeto proporciona una manera de conseguir esto:
instant.atZone(ZoneId.of("UTC")).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)
EDIT: Una versión anterior de esta respuesta utiliza el tiempo por defecto del sistema, así como ChronoUnit.ALIGNED_WEEK_OF_YEAR
. Este considera 1-7 de enero al ser "Semana 1" del año, sin importar en qué día de la semana 1 de enero de mentiras en un año en particular. Sin embargo, se basa en la parte de fecha del ZonedDateTime
.