私は2つのことが必要です:
現在の時刻を UTC に変換します (日付を UTC 形式で保存できるようにします) -->結果 = java.util.Date.
読み込まれた日付 (UTC 形式) を任意の TimeZone に変換します -->結果 = java.util.Date またはミリ秒。
両方の点で、日光を念頭に置いてください。
1)stackoverflowで次のことを見つけました:
Calendar c = Calendar.getInstance();
System.out.println("current: "+c.getTime());
TimeZone z = c.getTimeZone();
int offset = z.getRawOffset();
if(z.inDaylightTime(new Date())){
offset = offset + z.getDSTSavings();
}
int offsetHrs = offset / 1000 / 60 / 60;
int offsetMins = offset / 1000 / 60 % 60;
System.out.println("offset: " + offsetHrs);
System.out.println("offset: " + offsetMins);
c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
c.add(Calendar.MINUTE, (-offsetMins));
System.out.println("GMT Time: "+c.getTime());
--> 結果は UTC に等しい?
2)
public static long getTimeMillisFromTimeZone(long utcTimeMillis,
String timeZoneId) {
System.out.println("input millis: " + utcTimeMillis);
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.setTimeInMillis(utcTimeMillis);
TimeZone fromTimeZone = calendar.getTimeZone();
TimeZone toTimeZone = TimeZone.getTimeZone(timeZoneId);
calendar.setTimeZone(fromTimeZone);
calendar.add(Calendar.MILLISECOND, fromTimeZone.getRawOffset() * -1);
if (fromTimeZone.inDaylightTime(calendar.getTime())) {
calendar.add(Calendar.MILLISECOND, calendar.getTimeZone()
.getDSTSavings() * -1);
}
calendar.add(Calendar.MILLISECOND, toTimeZone.getRawOffset());
if (toTimeZone.inDaylightTime(calendar.getTime())) {
calendar.add(Calendar.MILLISECOND, toTimeZone.getDSTSavings());
}
System.out.println(calendar.getTime());
System.out.println("output millis: " + calendar.getTime().getTime());
return calendar.getTime().getTime();
}
--> 問題が発生しました --> 1 時間無駄になりました!
私の例では、TimeZone "Europe/Vienna" (夏時間を使用) からの Date を utc としてデータベースに格納しました。ヨーロッパ/ウィーン --> 10:00 UTC --> 09:00
この UTC (09:00) を「Europe/Vienna」に変換すると、次のようになります。 09:00 = 1 時間を失いました..