Java 8 Date API - 同一天的年份不同但时间不同

ser*_*0ne 3 java kotlin java-date java-calendar

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

注意,代码是用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)
}
Run Code Online (Sandbox Code Playgroud)

结果

1

2

假设

  • 星期日,12:00实际上是星期日,13:00在日历中
  • 星期日,23:00实际上是星期一,00:00在日历中

如何修改此选项以忽略时区,以便两个时间都在同一周内发生?

Joe*_*e C 5

你永远不应该使用遗产java.util.Date,java.util.Calendar如果你可以避免它们,这是众多原因之一.

ZonedDateTime对象提供了一种获取此方法的方法:

instant.atZone(ZoneId.of("UTC")).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)
Run Code Online (Sandbox Code Playgroud)

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