Java時間で何が起こっているのか、そしてこれに関連する何千もの投稿があるのか について完全に混乱しているので、jodaTimeを使用してUTCで時間を保存することができました:
Calendar cal = new GregorianCalendar();
cal.setTimeInMillis(DateTimeZone.getDefault().convertLocalToUTC(
cal.getTimeInMillis(), false));
私は hibernate を使用しているため (バージョン 4 で正しく動作するように JodaTime 用のアダプターを使用したくないため)、この jodaTime メソッドのみを使用して jdk 時間を utc に変換します。これは期待される結果を生成するようであり、現地時間 (現在のロンドン GMT+1) は、この現地時間から 1 を引くことによって UTC に変換されます。
ここまでは順調ですね。次に、特定のタイムゾーンの時間を取得するたびに、DST を含めて -3 であるべきところに -2 という間違ったオフセットを取得します。
カレンダー cal = new GregorianCalendar();
System.out.println("Local London Hours: "+cal.get(Calendar.HOUR_OF_DAY)); System.out.println("Local London Milliseconds: "+cal.getTimeInMillis()); cal.setTimeInMillis(DateTimeZone.getDefault().convertLocalToUTC( cal.getTimeInMillis(), false)); System.out.println("UTC Hours: "+cal.get(Calendar.HOUR_OF_DAY)); System.out.println("UTC Milliseconds: "+cal.getTimeInMillis()); // Time for specific time zone cal.setTimeZone(TimeZone.getTimeZone("Europe/Vilnius")); System.out.println("Vilnius Hours: "+cal.get(Calendar.HOUR_OF_DAY)); System.out.println("Vilnius Milliseconds: "+cal.getTimeInMillis()); // is this time in DST? - Yes System.out.println("Vilnius time is in DST: "+TimeZone.getTimeZone("Europe/Vilnius").inDaylightTime(cal.getTime()));
http://www.timeanddate.com/worldclock/city.html?n=660 特定のタイムゾーンのタイムゾーンの詳細
出力:
ロンドン現地時間: 21
ローカル ロンドン ミリ秒: 1381869901339
UTC 時間: 20
UTC ミリ秒: 1381866301339
ビリニュス 営業時間: 22 //これは 23 のはずです (リンクによると)
ビリニュス ミリ秒: 1381866301339
ビリニュスの時間は DST です: true //いいえ、時間の値が 23 ではないため、そうではありません