Java 8 Date API-一年中的一周对于同一天不同,但时间不同

Java 8 Date API-一年中的一周对于同一天不同,但时间不同,java,kotlin,date,java-calendar,Java,Kotlin,Date,Java Calendar,因为我只能假设是时区问题,下面的代码为同一天但不同的时间生成不同的一年中的一周值: 注意,代码是用Kotlin编写的 示例 fun main(args: Array<String>) { val middaySundayAfterEpoch = Instant.EPOCH + Duration .ZERO .plusDays(3) .plusHours(12) val almostMidnightSunday

因为我只能假设是时区问题,下面的代码为同一天但不同的时间生成不同的一年中的一周值:

注意,代码是用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)
}
fun main(args:Array){
val middaySundayAfterEpoch=瞬间.EPOCH+持续时间
.零
.星期四(3)
普卢舒尔斯先生(12)
val almostMidnightSundayAfterEpoch=瞬间.EPOCH+持续时间
.零
.星期四(3)
普卢舒尔斯先生(23)
println(一年一周(正午、周日、次年))
println(一年中的周末(几乎在午夜周日之后))
}
趣味getWeekOfYear(即时:即时):Int{
val calendar:calendar=calendar.getInstance()
calendar.time=日期.起始日期(即时)
return calendar.get(calendar.WEEK\u OF年)
}
结果

一,

二,

假设

  • 星期天,12:00实际上是星期天,日历上的13:00
  • 星期天23:00实际上是星期一,日历上的00:00
问题


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

如果可以避免,则不应使用遗留的
java.util.Date
java.util.Calendar
,这是许多原因之一

ZonedDateTime
对象提供了一种获取以下内容的方法:

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

编辑:此答案的早期版本使用了系统默认时间,以及
ChronoUnit.ALIGNED\u WEEK\u of u YEAR
。这将1月1日至7日视为一年中的“第一周”,无论1月1日在某一特定年份的第几天。但是,它将基于
ZonedDateTime

的日期部分,永远不要将糟糕的旧日期时间类(
日历
&
日期
)与现代java.time类(
即时
)混为一谈。在Java8及更高版本中采用JSR310之后,遗留类被完全取代。仅当与尚未更新为java.time的旧代码进行互操作时,才能转换为旧类或从旧类转换。换句话说,尽可能避免
日历
日期
。关于您的编辑,我如何实现1月5日至7日第二周的预期行为?