Java で 2014-04-27T13:10:02+09:00 のような ISO-8601 形式の日付文字列をパースし java.util.Date を取得する方法として、主に下記が考えられます。
ソースは http://github.com/fits/try_samples/tree/master/blog/20140427/
(1) 日付フォーマットのタイムゾーンに 'X' を使用 (Java SE 7 以降)
ISO-8601 のタイムゾーン部分のパターンに X を使えば SimpleDateFormat でパースできます。
ただし、X を使えるのは Java SE 7 以降です。
Sample1.java
import java.text.SimpleDateFormat; import java.util.Date; public class Sample1 { public static void main(String... args) throws Exception { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); Date date = df.parse(args[0]); System.out.println(date); } }
実行結果
> java Sample1 2014-04-27T13:10:02+09:00 Sun Apr 27 13:10:02 JST 2014
なお、タイムゾーンは +09:00 の他にも +0900 や +09 でもパース可能です。
(2) Apache Commons Lang の DateFormatUtils を使用
Commons Lang の DateFormatUtils でパースできます。
Commons Lang 3 なら DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT を使用すれば簡単です。
Sample2.java
import java.util.Date; import org.apache.commons.lang3.time.DateFormatUtils; public class Sample2 { public static void main(String... args) throws Exception { Date date = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.parse(args[0]); System.out.println(date); } }
実行結果
> java -cp .;commons-lang3-3.3.2.jar Sample2 2014-04-27T13:10:02+09:00 Sun Apr 27 13:10:02 JST 2014
+0900 のタイムゾーンもパース可能ですが、+09 では ParseException が発生しました。
まとめ
3種類のタイムゾーン表記 (+09:00, +0900, +09) のパース可否をまとめると下記のようになりました。
| 方法 | +09:00 のパース | +0900 のパース | +09 のパース |
|---|---|---|---|
| (1) 'X' の使用 | ○ | ○ | ○ |
| (2) Commons Lang 3.3.2 | ○ | ○ | × |