Java 8 Fecha API - La semana del año es diferente para el mismo día, pero tiempo diferente

Mateo Layton:

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?

Joe C:

Nunca se debe usar el legado java.util.Datey java.util.Calendarsi puedes evitarlos, siendo esta una de las muchas razones.

El ZonedDateTimeobjeto 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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=203523&siteId=1
Recomendado
Clasificación