Java で ISO-8601 日付文字列をパース

Java2014-04-27T13:10:02+09:00 のような ISO-8601 形式の日付文字列をパースし java.util.Date を取得する方法として、主に下記が考えられます。

  • (1) 日付フォーマットのタイムゾーンに 'X' を使用 (Java SE 7 以降)
  • (2) Apache Commons Lang の DateFormatUtils を使用

ソースは 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 ×