Javaの8日のAPI - 週年の同じ日が異なる時間に異なるです

マシュー・レイトン:

私は唯一のタイムゾーンの問題であると仮定することができるものについては、次のコードは、年間の同じ日の値が、異なる時間の異なる週が得られます。

注、コードは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カレンダーに実際に月曜日、午後12時00分です

質問

どのように私は両方の時間が同じ週に起こるように、タイムゾーンを無視するために、これを修正するのですか?

ジョー・C:

あなたは遺産を使うべきではありませんjava.util.Dateし、java.util.Calendarあなたはおそらくそれらを避けることができれば、多くの理由のこのビーイングの一つ。

ZonedDateTimeオブジェクトは、これを取得する方法を提供します:

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

EDIT:この回答の以前のバージョンでは、だけでなく、システムのデフォルトの時間を使用しましたChronoUnit.ALIGNED_WEEK_OF_YEARこれは関係なく、特定の年のどの週1月1日の嘘の日のの、今年の「週1」であることを1-7 1月を考慮しています。しかし、それがの日付部分に基づいて行われますZonedDateTime

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=203517&siteId=1