# ポイント
- Android 8以上で使える、令和表示に対応した和暦フォーマッターを作るための備忘録
- ICU4jv64.2のSimpleDateFormatを使う
# 動機
Androidアプリケーションで和暦表示が必要になったが、標準のAPIで「令和」対応するにはAndroid v11が必要。Androidのシェアはv9とか10とかが多いので、標準APIで「令和」と表示できないことが困る。
# 解決策
IBM社製ライブラリのICUでは、v64.2 (opens new window)から令和に対応している。icu.SimpleDateFormat
を用いて和暦をフォーマットすることで「令和」表示を可能にした。まずはapp levelのdependenciesに
implementation 'com.ibm.icu:icu4j:64.2'
を追加。
また、SimpleDateFormatはjava.util.Date
やCalendar
を引数にフォーマットするが、LocalDateTime
を使っていたのでDateへの変換 (opens new window)も必要になる。
例えば↓こんなクラスを用意してあげればいい。
class JPDateFormatter(formatStr: String) {
private val dateFormatter = SimpleDateFormat(formatStr, Locale("ja", "JP", "JP"))
private fun toDate(localDateTime: LocalDateTime?): Date? {
val zone = ZoneId.systemDefault()
val zonedDateTime = ZonedDateTime.of(localDateTime, zone)
val instant = zonedDateTime.toInstant()
return Date.from(instant)
}
fun format(ldt: LocalDateTime): String {
return dateFormatter.format(toDate(ldt))
}
}
例えば
val jpFormatter = JPDateFormatter("GGGGy年M月d日(E)")
val formatted = jpFormatter.format(LocalDateTime.of(2021, 2, 9))
とかすると、"令和3年2月9日(火)"
が得られる。