私はこの問題を調べてきましたが、明確で明確なドキュメントを見つけることができませんでした。
UTC時間とTimeZoneIDがあるとすると、夏時間が1年の間に変化することを知って、Javaで壁時間(= UTC時間+タイムゾーンオフセット+夏時間)を計算するにはどうすればよいですか?
テスト済みのコード例を探しています。ありがとう。
JavaでDateを使用する場合、内部では常にUTCになります。また、タイムゾーンにはDST設定が含まれているため、実際には非常に簡単です。
public static void main(String[] args) throws ParseException {
String stringAugust = "2011-08-01 12:00:00";
String stringNovember = "2011-11-01 12:00:00";
// Outputting the time in Stockholm and Santiago
// Stockholm has DST in August and not in November
// Santiago has DST in November and not in August
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// Parsing the Strings
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date dateAugust = sdf.parse(stringAugust);
Date dateNovember = sdf.parse(stringNovember);
// outputting the dates for Stockholm
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
sdf.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm"));
System.out.println(sdf.format(dateAugust));
System.out.println(sdf.format(dateNovember));
// outputting the dates for Santiago
sdf.setTimeZone(TimeZone.getTimeZone("America/Santiago"));
System.out.println(sdf.format(dateAugust));
System.out.println(sdf.format(dateNovember));
}
出力
2011-08-01 14:00:00 +0200
2011-11-01 13:00:00 +0100
2011-08-01 08:00:00 -0400
2011-11-01 09:00:00 -0300
UTCに時間があると言うとき、私はあなたがそれを保持していると仮定しますCalendar
(Date
誤解を招くにもかかわらず、タイムゾーンの概念はありませんtoString()
)。時間がある場合、たとえば、次のString
ように簡単に解析したり、カレンダーインスタンスを解析したりできます。
Calendar summer = new GregorianCalendar(DateUtils.UTC_TIME_ZONE);
summer.set(2011, Calendar.JUNE, 27, 9, 0, 0);
summer
2011年6月27日の午前9:00UTCを表します。これで、タイムゾーンをUTCからオーストラリアのメルボルンに変更するだけです。
summer.setTimeZone(TimeZone.getTimeZone("Australia/Melbourne"));
FastDateFormat
日付を正しく印刷するために使用します。
final FastDateFormat formatter = FastDateFormat.getDateTimeInstance(FastDateFormat.SHORT, FastDateFormat.SHORT);
System.out.println(formatter.format(summer));
メルボルンの時間は19:00(+10時間)です。ただし、日付を冬に変更します。
Calendar winter = new GregorianCalendar(DateUtils.UTC_TIME_ZONE);
winter.set(2011, Calendar.DECEMBER, 27, 9, 0, 0);
System.out.println(formatter.format(winter));
そして突然、メルボルンの時間は20:00(+11時間)になります。
Calendar
違いは、のタイムゾーンを変更するとDSTが考慮されることを証明しています。UTCタイムゾーンの6月の間、オーストラリアでは冬があります。したがって、彼らはDSTを監視しません。
しかし、UTCの冬の間、オーストラリアには夏があります-そして、彼らは時計を1時間シフトすることによってDSTに切り替えます。これが、冬のUTCの夏の+10に対して、冬の差が+11時間である理由です。
ちょっと待って!DSTを監視する複数のタイムゾーンを考慮すると、さらに興味深いものになります。まず、ヨーロッパ/オスロのタイムゾーンで同じ日付を作成します。
Calendar winter = new GregorianCalendar(TimeZone.getTimeZone("Europe/Oslo"));
winter.set(2011, Calendar.DECEMBER, 27, 9, 0, 0);
冬のオスロの9:00はUTC8:00ですが、メルボルンの19:00(+10時間)です。
しかし、夏の同じ時間:
Calendar summer = new GregorianCalendar(TimeZone.getTimeZone("Europe/Oslo"));
summer.set(2011, Calendar.JUNE, 27, 9, 0, 0);
実はメルボルンでは7:00UTCと17:00です!+8時間!
どういうわけか、人々は2つのタイムゾーンの違いが常に一定であると想定しています(「オスロとメルボルンの違いは常に10時間です)。これは、特に異なる半球を考慮した場合には当てはまりません。
実際には、オスロの冬の間(DSTなし、UTC + 1)、メルボルン(UTC + 11)でDSTが観測されます。一方、オスロでは夏時間があり、DSTが観測されている(UTC + 2)が、メルボルンでは観測されていない(UTC + 10)。これで、1年の日によって違いが8時間から10時間の間で変化する理由が明らかになります。
また、DSTの最初と最後の日はグローバルではなく、タイムゾーンごとに任意に選択されることを忘れないでください。これは、9時間の差も可能であることを意味します(!)たとえば、今年の4月1日をチェックしてください。