DayOfWeek は曜日を示す列挙型で、月曜日を起点として順序付けの整数(1から7まで)を持っています*1。Java の実装は java.time.DayOfWeek で、Kotlin では kotlinx.datetime.DayOfWeek です。
kotlinx.datetime 自体は DateTime 専用のライブラリとして提供されていて、バージョン 0.6.x まで DayOfWeek の実体は java.time.DayOfWeek へのエイリアスになっていたので、実装はすべて java.time.DayOfWeek のものでした。
kotlinx.datetime 0.7.x では java.time への依存を減らす目的で破壊的変更が入っており、DayOfWeek も改めて Kotlin で書き直され java.time.DayOfWeek へのエイリアスではなくなりました。仕様としては java.time.DayOfWeek も kotlinx.datetime.DayOfWeek も ISO-8601 に従っているのでほぼ同じように扱えますが、書き直す過程で java.time.DayOfWeek にあったメソッドが置き換わったり完全になくなったりしているため、場合によってはパッケージの置き換え以外のマイグレーションが必要です。
DayOfWeek の足し算・引き算
DayOfWeek の足し算・引き算は曜日をn日分ずらす操作です。java.time.DayOfWeek にはそれぞれ plus / minus メソッドが定義されていて、Kotlin がうまくオペレーターのオーバーロードとして解釈してくれるので、次のコードはコンパイル・実行可能です。
// kotlinx.datetime 0.6.x までで動作するコード // 月曜日の翌日なので火曜日になる val tuesday = DayOfWeek.MONDAY + 1 // 月曜日の前日なので日曜日になる (内部で順序付けの整数をうまく計算してくれて7番目の曜日である日曜日にしてくれる) val sunday = DayOfWeek.MONDAY - 1
kotlinx.datetime 0.7.x では書き直された enum に plus / minus メソッドの定義がないのでそもそもコンパイルができません。
このような操作が必要な場合は、次のように自分で拡張関数を用意しオペレーターをオーバーロードします。
// 曜日の宣言順序が Java の enum と一致しているので中身は Java の実装そのままでも可 operator fun DayOfWeek.plus(days: Int): DayOfWeek { val amount = (days % 7).toInt() return DayOfWeek.entries[(ordinal + (amount + 7)) % 7] } operator fun DayOfWeek.minus(days: Int): DayOfWeek { return plus(-(days % 7)) }
DayOfWeek.of
整数型から DayOfWeek を得るためのメソッドで、DayOfWeek をシリアライズするときに便利です(ISO-8601 で定義された数字とマッピングしてくれる)が、kotlinx.datetime 0.7.x の DayOfWeek は次の関数を使います。
public fun DayOfWeek(isoDayNumber: Int): DayOfWeek { require(isoDayNumber in 1..7) { "Expected ISO day-of-week number in 1..7, got $isoDayNumber" } return DayOfWeek.entries[isoDayNumber - 1] }
*1:ISO-8601 で規格化されていますが、java.util.Calendar に定義されている曜日を表す定数はこの規格に従っていません