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
假设
- 星期天,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_WEEK_OF_YEAR
。这将 1 月 1 日至 7 日视为一年中的 "week 1",而不管 1 月 1 日在特定年份的一周中的哪一天。但是,它将基于 ZonedDateTime
.
的日期部分
我只能假设是时区问题,以下代码在同一天但不同时间产生不同的一年中的一周值:
注意,代码是用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
问题
如何修改它以忽略时区,以便两次都发生在同一周?
如果可以避免使用旧版 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 月 1 日至 7 日视为一年中的 "week 1",而不管 1 月 1 日在特定年份的一周中的哪一天。但是,它将基于 ZonedDateTime
.