Android 6.0、Marshmallowで日付の書式設定に問題が発生しました。以下に述べる例外をスローするコードは、私のアプリケーションがAPIリクエスト(「クライアント」)に使用する純粋なJavaライブラリ(別途構築)です。ライブラリはJava 1.6で構築されていますが、これは関連しています...とにかく、ここにコードです。Android MarshmallowでのSimpleDateFormat動作の変更
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd E hh:mm aa", Locale.UK);
Date eventDate = dateFormat.parse(StringUtils.substring(record, 0, 23).trim());
... record
は値を持っています。 "トリミング"の後である...;
2015-10-23 Fri 10:59 PM
yyyy-MM-dd E hh:mm aa
このコードは、フローズンヨーグルトの良い古い時代から働いており、ユニットテストされています。マーシュマロー以外のすべてが例外をスローします。
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: SynchroniseTidePosition.doInBackground
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: java.text.ParseException: Unparseable date: "2015-10-23 Fri 10:59 PM" (at offset 21)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: at java.text.DateFormat.parse(DateFormat.java:579)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: at com.oceanlife.rover.handler.XTideParser.parseResponse(XTideParser.java:69)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: at com.brantapps.oceanlife.task.SynchroniseTidePosition.doInBackground(SynchroniseTidePosition.java:107)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: at com.brantapps.oceanlife.task.SynchroniseTidePosition.doInBackground(SynchroniseTidePosition.java:43)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: at android.os.AsyncTask$2.call(AsyncTask.java:295)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: at java.lang.Thread.run(Thread.java:818)
オフセット "21"は10:59の '9'の後のスペースです。誰もこの失敗を説明できますか?
更新ジョダ時に切り替え
、それは、より有益なエラーメッセージを吐き出し。ここにあります;
Invalid format ... is malformed at "PM"
...ので、これを解析することがしようとしている文字列のAM/PMの側面についてです - the docs
暗闇の中で撮影:文字列がUTF-8/UTF-16エンコーディングではないことを確認できますか? –
こんにちは@MorrisonChang - 文字列は文字セットで解析されます。 Charset.forName( "UTF-8") 何を考えていますか? – OceanLife
申し訳ありませんが、ただアイデアを投げ捨てます。これが見つかりました:http://stackoverflow.com/questions/24399846/android-simpledateformat-parsing-error(これまでの単体テストの成功は説明していません)とこれはhttps://code.google.com/p/androidです/ issues/detail?id = 158265。それがそうであれば再び謝罪するよりも騒音が多いかもしれません。 –