まず何はなくとも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 を変えてやれば短縮形とか一文字だけとかの形式で取得できる。