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?
Você nunca deve usar o legado java.util.Date
e java.util.Calendar
se você pode, possivelmente, evitá-los, sendo esta uma das muitas razões.
O ZonedDateTime
objeto 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
.