3

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

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

问题

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

4

1 回答 1

5

你永远不应该使用遗留物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 日视为一年中的“第 1 周”,无论 1 月 1 日位于特定年份的一周中的哪一天。但是,它将基于ZonedDateTime.

于 2019-01-03T22:25:16.000 回答