2015-10-23 12 views
6

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

+0

暗闇の中で撮影:文字列がUTF-8/UTF-16エンコーディングではないことを確認できますか? –

+0

こんにちは@MorrisonChang - 文字列は文字セットで解析されます。 Charset.forName( "UTF-8") 何を考えていますか? – OceanLife

+0

申し訳ありませんが、ただアイデアを投げ捨てます。これが見つかりました:http://stackoverflow.com/questions/24399846/android-simpledateformat-parsing-error(これまでの単体テストの成功は説明していません)とこれはhttps://code.google.com/p/androidです/ issues/detail?id = 158265。それがそうであれば再び謝罪するよりも騒音が多いかもしれません。 –

答えて

12
に戻っ

英国ロケールは「午前」のその定義を持っていたように見え、 " pm "が変更されました。

マシュマロウでは、英国のロケールに「a.m」と表示されます。 「p.m」によって「pm」と表示されます。

String record = "2015-10-23 Fri 10:59 p.m. BST 3.60 meters" 
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd E hh:mm aa", Locale.UK); 

// note the length is 25 now, not 23... 
Date eventDate = dateFormat.parse(StringUtils.substring(record, 0, 25).trim()); 

なぜ私が説明を提供することはできませんが、米国のロケールは、AM/PMとa.m./p.mと英国で動作します。

編集

2015年3月でのロケールの更新プログラムの一環として、en_gbロケールがそのAM/PMの定義は置き換えられていたことが表示されます。 source diff

+0

ありがとうございます。私は昨夜の変更を元に戻し、テストする米国のロケールに切り替えるだけです。 – OceanLife

+1

それを修正しました!ありがとうございます - ダニと+1。アプリがマシュマロをサポートするように更新されているので、これが人気のある回答になることは間違いありません。よくやった。今すぐ実行時の権限に! – OceanLife

関連する問題