java.time(ZonedDateTime / DST)難易度 高無料
米国 America/New_York は 2026年3月8日 午前2:00 に夏時間(DST)へ切替(時計が2:00→3:00へ1時間進む)。次のコードの出力は?
1 import java.time.*;
2 public class Q7 {
3 public static void main(String[] a) {
4 ZoneId ny = ZoneId.of("America/New_York");
5 ZonedDateTime z =
6 ZonedDateTime.of(2026, 3, 7, 12, 0, 0, 0, ny); // 3/7 12:00(切替前日の正午)
7 ZonedDateTime d = z.plusDays(1); // 「1日」足す
8 ZonedDateTime h = z.plusHours(24); // 「24時間」足す
9 System.out.println(d.getHour());
10 System.out.println(h.getHour());
11 }
12 }- A
12改行12 - B
12改行13 - C
13改行13 - D
11改行12
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:B✓Gold監修
解説
ZonedDateTime の加算メソッドは、操作する「時間軸」が2系統に分かれる。これが DST をまたぐと結果を分ける。
日・週・月・年系(plusDays など)=ローカル時間軸(local time-line)で計算する。「壁の時計を1日進める」イメージ。
3/7 12:00 +1日 → 3/8 12:00(DST 切替後でも、壁時計の“12:00”はそのまま)。getHour()=12。
時・分・秒系(plusHours など)=インスタント時間軸(instant time-line)で計算する。「実時間でちょうど24時間後」。
3/8 の 2:00→3:00 で1時間が“消える”ため、実時間24時間後の壁時計は25時間進んだように見え → 3/8 13:00。getHour()=13。
つまり 「1日」≠「24時間」。DST 切替日だけは plusDays(1) と plusHours(24) が壁時計で1時間ずれる。
- A
plusHours(24)もローカル時間軸だと誤解。時・分・秒系はインスタント時間軸なので、DST で1時間ずれて13になる。 - C
plusDays(1)までインスタント計算だと誤解。日・月・年系はローカル時間軸なので壁時計12:00を維持する。 - D進む向き(春の繰り上げ=時計が進む)を逆(繰り下げ)に取った誤り。春のDSTは1時間“失う”ので壁時計はむしろ先へ。
ひっかけ: 「24時間 = 1日」という常識。
ZonedDateTime では plusDays=ローカル軸(カレンダー)/plusHours=インスタント軸(実時間) で、DST 境界をまたぐと両者が分岐する(公式 Javadoc も「adding one day is not the same as adding 24 hours」と明記)。実機確認の答え合わせ
出力: 12 13 (参考・完全な値) plusDays(1) → 2026-03-08T12:00-04:00[America/New_York] plusHours(24)→ 2026-03-08T13:00-04:00[America/New_York] ※ どちらもオフセットは -04:00(EDT=夏時間)になっている点に注目。
✓Gold 保有者による書き下ろし解説・実機で検証済