BLOGTIMES
2012/01/17

Javaで ISO 8601形式の入出力を実装する

  java  programming 
このエントリーをはてなブックマークに追加

Java で ISO 8601 形式の日付の入出力を作る必要があったのでメモ。Java6 の SimpleDateFormat では ISO 8601 のタイムゾーンの表現できないのに加えて、マルチスレッド対応でないというハマりポイントもある*1らしいので、大人しくapache-commons-langに頼ることにします。ちなみに Java7 のSimpleDateFormat には "X" というフォーマット文字列が追加されているので、これを使えばいけそうではあるんですけどね。

以下、作業メモ。

サンプルコード

作ってみたコードはこんな感じ。
GMTを表すZの処理が微妙な感じですが、とりあえずこれで使えそうな感じです。

ISO8601Example.java

import java.text.ParseException; import java.util.Date; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateUtils; public class ISO8601Example { @SuppressWarnings("deprecation") public static void main(String[] args) { String str = "2012-01-23T12:34:56+09:00"; System.out.println("Before:"+str); System.out.println("After(Local):"+parseDate(str)); System.out.println("After(GMT):"+parseDate(str).toGMTString()); System.out.println(); str = "2012-01-23T12:34:56+00:00"; System.out.println("Before:"+str); System.out.println("After(Local):"+parseDate(str)); System.out.println("After(GMT):"+parseDate(str).toGMTString()); System.out.println(); str = "2012-01-23T12:34:56Z"; System.out.println("Before:"+str); System.out.println("After(Local):"+parseDate(str)); System.out.println("After(GMT):"+parseDate(str).toGMTString()); } public static String toISO8601(Date date){ return DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.format(date); } public static Date parseDate(String dateString){ Date date = null; try { date = DateUtils.parseDate(dateString, DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern() ); } catch (ParseException e) { try { date = DateUtils.parseDateStrictly(dateString, DateFormatUtils.ISO_DATETIME_FORMAT.getPattern()+"'Z'"); date = DateUtils.addHours(date, 9); } catch (ParseException e1) { e1.printStackTrace(); } } return date; } }

実行結果はこんな感じ。

Before:2012-01-23T12:34:56+09:00 After(Local):Mon Jan 23 12:34:56 JST 2012 After(GMT):23 Jan 2012 03:34:56 GMT Before:2012-01-23T12:34:56+00:00 After(Local):Mon Jan 23 21:34:56 JST 2012 After(GMT):23 Jan 2012 12:34:56 GMT Before:2012-01-23T12:34:56Z After(Local):Mon Jan 23 21:34:56 JST 2012 After(GMT):23 Jan 2012 12:34:56 GMT

参考

 ・JavaでのISO 8601形式の日時の処理 - drambuieの日記
 ・Java で ISO-601 の日付文字列を parse する | 裏表(Phinloda のもう裏だか表だか分からないページ)


トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/4712
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン