KotlinでAndroidアプリを作っていて、WebのAPIで返ってきたUTC標準時刻で記載された文字列の日時を、日本時刻に変換して表示する方法。
文字列をDateに、Dateを文字列に、というあたりの情報は結構見つかったのですが、TimeZoneを変更して出力するというやり方は「これ」というのが見当たらず、いくつかのページを参考に試行錯誤したらできたんですが自分で忘れそうなので備忘録です。
やったこと
以下の手順で処理したらできました。
- UTCで書かれた文字列(私が扱っていた元データはISO8601形式だったので
"yyyy-MM-dd'T'HH:mm\:ssZ"
でした)を、Dateに変換 - DateをCalendarに変換
- CalendarにTimezoneをセット
- DateFormatを指定して、文字列を出力
実際のソースコードはこちら
import android.text.format.DateFormat
import android.icu.text.SimpleDateFormat
import java.util.*
val df = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
val jpCal:Calendar = Calendar.getInstance()
jpCal.time = df.parse(item.updateDateTime)
jpCal.timeZone = TimeZone.getTimeZone("Asia/Tokyo")
holder.mUpdateDTView.text = DateFormat.format("MM-dd HH:mm",jpCal)
item.updateDateTime内に、例えば 2019-04-12T01:00:00Z
という文字列が設定されているとして、これでmUpdateDTView.textの中には 04-12 09:00
という文字列が出力されるようになりました。
多分ですが、"Asia/Tokyo"
のところを、端末の標準設定とか持ってこれれば、APIから返ってきた時刻を、その端末の現地時間に合わせて表示できるんじゃないのかなと思います。(未検証ですが…)
若干冗長な気はしているので、もっと簡単にできるよ~という方法があったら是非教えて頂きたいです。m(__)m
参考にさせていただいたサイト
https://developer.android.com/reference/android/text/format/DateFormat.html
https://qiita.com/emboss369/items/5a3ddea301cbf79d971a
https://stackoverflow.com/questions/48838992/how-to-convert-date-string-to-timestamp-in-kotlin