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