まず何はなくともthreetenABPを入れる。
implementation 'com.jakewharton.threetenabp:threetenabp:1.2.3'
時刻表現のフォーマット
Java8のDate and Time APIのDateTimeFormatterにはいくつかのフォーマットがすでに登録されている。
DateTimeFormatter (Java Platform SE 8)
一方、nasneの録画予約の時刻表現は次のようになっている。
2020-04-21T22:00:00+0900
よく見るとオフセットの時刻表現にコロンがなく、ISO_OFFSET_DATE_TIMEなどに合致しない。そこで、このフォーマットをパースするための独自のFormatterを次のように定義する。
val NASNE_DATE_TIME_FORMAT: DateTimeFormatter = DateTimeFormatterBuilder().parseCaseInsensitive()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME) // 日付の部分まではISO_LOCAL_DATE_TIMEを使う
.appendOffset("+HHMM", "Z") // 独自の部分(注:オフセットがない時の文字列"Z"は想像)
.toFormatter()
.withChronology(IsoChronology.INSTANCE)
曜日のローカル表現を取得する
InstantをOffsetDateTimeに変換して、dayOfWeekを取得する。これは DayOfWeek 型のEnumで、このクラスのgetDisplayName()からローカル表現を取得する。
val dateTime = NASNE_DATE_TIME_FORMAT.parse("2020-04-21T22:00:00+0900", Instant.FROM)
.atOffset(OffsetDateTime.now().offset)
dateTime.dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.getDefault()) // =>日本語の環境なら"火"
第1引数の TextStyle を変えてやれば短縮形とか一文字だけとかの形式で取得できる。