Java 8 Data API - Semana do ano é diferente para o mesmo dia, mas o tempo diferente

Matthew Layton:

Para o que eu só posso supor que é uma questão de fuso horário, o seguinte código produz diferentes semana de valores de ano para o mesmo dia, mas os tempos diferentes:

Note, o código é escrito em Kotlin

Exemplo

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

Premissas

  • Domingo, 12:00 é realmente domingo, 13:00 no calendário
  • Domingo, 23:00 é realmente segunda-feira, 00:00 no calendário

Questão

Como posso modificar este ignorar o fuso horário, de modo que ambas as vezes ocorrem na mesma semana?

Joe C:

Você nunca deve usar o legado java.util.Datee java.util.Calendarse você pode, possivelmente, evitá-los, sendo esta uma das muitas razões.

O ZonedDateTimeobjeto fornece uma maneira de obter isto:

instant.atZone(ZoneId.of("UTC")).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)

EDIT: Uma versão anterior desta resposta usou o tempo padrão do sistema, bem como ChronoUnit.ALIGNED_WEEK_OF_YEAR. Este considera 1-07 janeiro para ser "semana 1" do ano, independentemente de em qual dia da semana de 1 de Janeiro encontra-se em um determinado ano. No entanto, ele irá basear-se na parte da data da ZonedDateTime.

Acho que você gosta

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