日付とタイムゾーン

以前書いた、TimeZoneを考慮した日付のフォーマット - suusuke@Hatenaで、タイムゾーンを"GMT"に指定しているのに Calendar#getTime() をコンソールに出力すると"JST"が表示されるっていうなぞ?が解決した。


そもそも、Dateにタイムゾーンは無いみたいだ。動作環境のタイムゾーンに依存するみたい。


2007-06-14をみて理解できた。

// タイムゾーンの違う2つのカレンダーを作成。
Calendar utc = Calendar.getInstance( TimeZone.getTimeZone( "UTC" ) );
Calendar jst = Calendar.getInstance( TimeZone.getTimeZone( "JST" ) );

System.out.println( "\n各カレンダーのタイムゾーン" );
System.out.println( "  utc: " + utc.getTimeZone() );
System.out.println( "  jst: " + jst.getTimeZone() );

// タイムゾーンに関係なく、現在の「1970 年 1 月 1 日 00:00:00 GMT からのミリ秒」は一定。
System.out.println( "\n現在時刻の「1970 年 1 月 1 日 00:00:00 GMT からのミリ秒」" );
System.out.println( "  utc: " + utc.getTime().getTime() );
System.out.println( "  jst: " + jst.getTime().getTime() );


// 日付を設定
utc.set( 2007, 5, 5, 0, 0, 0 );
jst.set( 2007, 5, 5, 0, 0, 0 );

// 2007-06-05 00:00:00 の「1970 年 1 月 1 日 00:00:00 GMT からのミリ秒」
// は「2007-06-05 00:00:00」を解析するカレンダーのタイムゾーンに左右される。
System.out.println( "\n設定した日時の「1970 年 1 月 1 日 00:00:00 GMT からのミリ秒」" );
System.out.println( "  utc: " + utc.getTime().getTime() );
System.out.println( "  jst: " + jst.getTime().getTime() );

java.util.Calendarは使いにくいなぁ。それに比べて、org.joda.time.DateTimeは使いやすい。