2012-02-08 7 views
1

私はJodaを使用できません。私は、UTCの日付または日時を表す文字列から日付やカレンダーを作成しようとすると、結果のオブジェクトは、それに関連付けられたタイムゾーンを持っている...TimeZone ging haunting私の日時解析

ここでは、コードです:

ケース1:

は、
SimpleDateFormat sdf = new SimpleDateFormat("yyyyDDD"); 
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
Date date = sdf.parse("2012018"); 
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")); 
cal.setTime(date); 
System.out.println(cal.getTime()); //Tue Jan 17 19:00:00 EST 2012 !?!*&#&?? 

ケース2:あなたが時間を印刷するとき

SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmm"); 
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
Date date = sdf.parse("1202011431"); 
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")); 
cal.setTime(date); 
System.out.println(cal.getTime()); //Wed Feb 01 09:31:00 EST 2012 !?!*&#&?? 

答えて

3

タイプjava.util.Dateのオブジェクトは、エポックからの絶対的な時間です。カレンダーからDateオブジェクトを作成すると、カレンダーが使用していたTimeZoneが失われ、生の時間が得られます。 ESTは実際にあなたのDateに「関連づけられていません」ということは、DateのtoStringメソッドがJVMのデフォルトのタイムゾーンを使用して人間が読める表現を作成しているということです。

上記のコードサンプルでのカレンダーの使用方法は、は絶対に何もしていないことを理解することが重要です。そのようなタイムゾーンだけを変更すると、そのカレンダーの人間が読める表現が変更されます。エポック以降の生のミリ秒数は、setTimegetTimeを呼び出す前後で同じです。

(人間が判読可能な表現に関連するjava.util.Dateのメソッドはすべて非推奨であり、正しく機能しません。単に存在しないふりをするのが最善です)

1

、それは常にあなたのマシン上で設定されたローカルタイムゾーンで印刷され、それはあなたが望むものである(ストアと表す日付/時刻はUTCで表示され、プレゼンテーション中にユーザー固有のタイムゾーンに変換されます)。

1

はい、Javaの日付にはタイムゾーンが関連付けられています。 DateのtoStringは、ローカルタイムゾーンの日付を出力します。必要がない場合は、DateFormatを使用して表示しないでください。注目すべきことは、DateFormatのタイムゾーンをUTCに設定する必要があることに注意してください。