fresh digitable

セミコロンたちが躍動する おいらのコードを 皆さんに 見せたいね

nasneの録画予約の時刻表現をパースしてついでに曜日のローカル表現を取得する

まず何はなくとも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)

曜日のローカル表現を取得する

InstantOffsetDateTimeに変換して、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 を変えてやれば短縮形とか一文字だけとかの形式で取得できる。