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

次のコードの出力として正しいものを選べ。

1   import java.time.*;
2   import java.time.temporal.ChronoUnit;
3   public class Q6 {
4       public static void main(String[] a) {
5           LocalDate d1 = LocalDate.of(2026, 1, 31);
6           LocalDate d2 = LocalDate.of(2026, 3, 1);
7           Period p = Period.between(d1, d2);
8           System.out.println(p.getMonths() + " " + p.getDays());
9           System.out.println(ChronoUnit.DAYS.between(d1, d2));
10      }
11  }

(2026年は閏年ではなく、2月は28日まで)

  1. A1 1 改行 29
  2. B1 1 改行 28
  3. C0 29 改行 29
  4. D1 0 改行 29
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AGold監修

解説

PeriodChronoUnit.DAYS は「期間」の数え方が根本的に違う。

Period.between(d1, d2)カレンダー的な年・月・日に分解する。 2026-01-31 → 2026-03-01 を計算する内部手順は:

  • まず月差を取る:1月→3月で「2か月」、ただし日が 1 - 31 = マイナス なので月を1つ繰り下げて「1か月」。
  • 繰り下げた基準 d1 + 1か月 = 2026-02-31? → 2月末に丸めて 2026-02-28
  • そこから 2026-03-01 までの残り日数 = 1日

よって Period は「1か月1日」。getMonths()=1getDays()=1 → 出力 1 1

ChronoUnit.DAYS.between(d1, d2)実日数(通算日)を返す。 1月31日 → 2月28日が28日、さらに3月1日まで1日で 29日

各誤答が違う理由
  • B通算日を28と誤算。2月28日からさらに3月1日まで1日あるので29。
  • CPeriod を「0か月29日」と捉える誤り。Period は年月日に正規化するため、29日ではなく「1か月1日」になる。
  • D残り日数を0と誤算。月末丸め(2/28)後、3/1まで1日残るので getDays()=1
ひっかけ: 最大の罠は 「1月31日 + 1か月 = 2月28日」という月末丸めPeriod は実日数ではなくカレンダー単位なので、月の長さの違いを吸収して「1か月1日」になる。一方 ChronoUnit.DAYS は純粋な日数(29)。同じ2日付でも「期間の表し方」で答えが変わるのが核心。
実機確認の答え合わせ
出力:
1 1
29
公式ドキュメント・関連Period.between()ChronoUnit.between()
Gold 保有者による書き下ろし解説・実機で検証済
この分野をもっと解いて、得点源に
java.time を含む全問を分野別に演習できます(無料)。
演習する →