JavaのSimpleDateFormatとキャッキャウフフしてみた件

ヨーロッパ某所から送られてくるデータを取り扱う必要があって、日付フィールドみてみたら、

12/14/2012 1:17:09 AM

ほほぅ、何やらシブい感じだぜ、と。   SimpleDateFormatのAPIのページみたら、 http://docs.oracle.com/javase/jp/6/api/java/text/SimpleDateFormat.html) h が 午前/午後の時 (1 ~ 12) なのはイイんだけど、 getNativeImageMetadataFormat から が 午前/午後 って…。ハァ?っていう。。 んで、英語のページみると http://docs.oracle.com/javase/jp/6/api/java/text/SimpleDateFormat.html a が Am/pm marker だよん、と。   APIのページの下の方の例をみても、

Date and Time Pattern が "h:mm a" で Result が 12:08 PM ですって感じで良さげです。   ってことで、

SimpleDateFormat hogeDateFormat = new SimpleDateFormat("MM/dd/yyyy h:mm:ss a");
hogeFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
Date hogeDate = hogeDateFormat.parse("送られてきた日付文字列");

って感じで実装したら、パース出来ねーって怒られてもーたがや。

Exception in thread "main" java.text.ParseException: Unparseable date: "12/14/2012 1:17:09 AM"
    at java.text.DateFormat.parse(DateFormat.java:357)

  ググってたら@ITのページで、 SimpleDateFormat AM PM がうまくいかない というのを発見。ドンピシャ。ありがとうございました! ってことで、SimpleDateFormatのインスタンス作るときにロケール指定してやります。

SimpleDateFormat hogeDateFormat = new SimpleDateFormat("MM/dd/yyyy h:mm:ss a", Locale.ENGLISH);

  無事パースできたDateオブジェクトを、日本で扱うのでJSTでフォーマットしてやってメデタシ。

SimpleDateFormat hageDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
hageDateFormat.setTimeZone(TimeZone.getTimeZone("JST"));
String hageDate = hageDateFormat.format(hogeDate);

  海外とデータやりとりするとこういうの今後も増えていきそうだな~   ってか、APIちゃんと読むとマルチスレッドで使う時は気付けなはれとか書いてあるんですねぇ。 これはたまにハマったって話きくので気つけませう↓

日付フォーマットは同期化されません。スレッドごとに別のフォーマットインスタンスを 作成することをお勧めします。複数のスレッドがフォーマットに並行してアクセスする場合は、 外部的に同期化する必要があります。

 

Effective Java 第2版 (The Java Series)
Joshua Bloch
ピアソンエデュケーション
売り上げランキング: 33,709