Java 8 日期 API - 同一天不同时间的一周不同

Java 8 Date API - Week of year is different for the same day but different time

我只能假设是时区问题,以下代码在同一天但不同时间产生不同的一年中的一周值:

注意,代码是用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

假设

问题

如何修改它以忽略时区,以便两次都发生在同一周?

如果可以避免使用旧版 java.util.Datejava.util.Calendar,则永远不要使用它们,这是众多原因之一。

ZonedDateTime 对象提供了一种获取方式:

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

编辑:此答案的先前版本使用系统默认时间,以及 ChronoUnit.ALIGNED_WEEK_OF_YEAR。这将 1 月 1 日至 7 日视为一年中的 "week 1",而不管 1 月 1 日在特定年份的一周中的哪一天。但是,它将基于 ZonedDateTime.

的日期部分