マシュー・レイトン:
私は唯一のタイムゾーンの問題であると仮定することができるものについては、次のコードは、年間の同じ日の値が、異なる時間の異なる週が得られます。
注、コードは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
。