Java で ISO-8601 日付文字列をパース
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 | ○ | ○ | × |