対策する資格
Java Silver ・ 近日ORACLE Silver ・ 近日
Gold 保有者 監修1Z0-829 対応
java.time(ZonedDateTime / DST)難易度 高無料

米国 America/New_York2026年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  }
  1. A12 改行 12
  2. B12 改行 13
  3. C13 改行 13
  4. D11 改行 12
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:BGold監修

解説

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:00getHour()=13

つまり 「1日」≠「24時間」。DST 切替日だけは plusDays(1)plusHours(24) が壁時計で1時間ずれる。

各誤答が違う理由
  • AplusHours(24) もローカル時間軸だと誤解。時・分・秒系はインスタント時間軸なので、DST で1時間ずれて13になる。
  • CplusDays(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 保有者による書き下ろし解説・実機で検証済
この分野をもっと解いて、得点源に
java.time を含む全問を分野別に演習できます(無料)。
演習する →