Java 8 Date API - неделя года отличается для одного и того же дня, но в другое время - PullRequest
0 голосов
/ 04 января 2019

Поскольку я могу только предположить, что это проблема часового пояса, следующий код выдает разные значения недели года для одного и того же дня, но в разное время:

Обратите внимание, код написан на Kotlin

Пример

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)
}

Результаты

1

2

Допущения

  • Воскресенье, 12:00 фактически воскресенье, 13:00 в календаре
  • Воскресенье, 23:00 этофактически понедельник, 00:00 в календаре

Вопрос

Как мне изменить это, чтобы игнорировать часовой пояс, чтобы оба раза происходили в одном и том женеделя

1 Ответ

0 голосов
/ 04 января 2019

Никогда не следует использовать устаревшие java.util.Date и java.util.Calendar, если вы можете избежать их, это одна из многих причин.

Объект ZonedDateTime предоставляет способ получить это:

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

РЕДАКТИРОВАТЬ: предыдущая версия этого ответа использовала системное время по умолчанию, а также ChronoUnit.ALIGNED_WEEK_OF_YEAR.Считается, что 1-7 января является «неделей 1» года, независимо от того, какой день недели 1 января находится в определенном году.Тем не менее, он будет основан на части даты ZonedDateTime.

...