Rssフィールドから日付を取得していたら、parseExceptionが出ました。
parseExceptionが起こった時の確認点をまとめたいと思います。
エラーは下記になります
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.support.v4.content.ModernAsyncTask$3.done(ModernAsyncTask.java:161)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.text.ParseException: Unparseable date: "Fri, 24 May 2019 13:10:14 +0900"
at java.text.DateFormat.parse(DateFormat.java:362)
// (省略)
####①形式はあっているか?
Rss.kt
val formatter = SimpleDateFormat("EEE, dd MM yyyy HH:mm:ss z")
最初に上記のように記載してしまいました。
リファレンスを見てみると、形式に誤りがあることがわかりました。
文字 | 説明 | 使用例 |
---|---|---|
y | 年 | yyyy = 2019 yy = 19 |
M | 月 | MMMM = July MMM= Jul MM = 07 M = 7 |
H | 時間 | HH = 08 |
m | 分 | mm=20 |
s | 秒 | ss= 58 |
z | General タイムゾーン | JST |
Z | RFC 822 タイムゾーン | +0900 |
a | AM/PM | AM |
k | 1日の中での時間 | 13 |
K | AM/PMの中での時間 | 01 |
上の表によると、MM
という部分と、z
の部分を間違っていました。
大文字・小文字で意味が全く違うものもあるので、要注意です。
下記の形式でパースできるはずです。
Rss.kt
val formatter = SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z")
####②環境依存はないか?
①だけだと不完全です。
パースしてみると下記が出力されます。
金, 24 5 2019 13:10:14 +0900
曜日が日本語表示になっていました。
デフォルトが日本語になっているようでした。
SimpledateFormatで形式を設定するときにロケールを設定する必要があります。
Rss.kt
val formatter = SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US)
うまくパースできないときは上記のことを確認してみるといいかもしれません。
####参照
Android Developers SimpleDateFormat
SimpleDateFormatクラスparseメソッドのLocaleに注意