1Z0-826-JPN 対応
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
✓ 正解:A✓有資格者監修

解説

Period と ChronoUnit.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()=1、getDays()=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()↗
✓有資格者(著者)による書き下ろし解説

有資格者(著者)が監修した問題は、すべて無料サンプルとして公開しています。買う前に、その全部を実際に解いて解説まで読めます。有料で追加される問題はAIが作成したもので、有資格者の監修は入っていません。

この問題集の作り方

  1. 問題と解説はAIが作成しています。有資格者(著者)が監修した問題は、無料サンプルとして公開している分だけです。有料で追加される問題に監修は入っていません。
  2. 各問に、公式ドキュメントの出典リンクを付けています。書いてあることは、出典に当たって確かめられます。
  3. 誤答の選択肢それぞれに、なぜ誤りなのかの理由を書いています。
  4. 解説に載せているコンパイル結果は、実際に javac を走らせた出力です。想定した挙動ではありません。
  5. 誤りを見つけたら報告できます。原則として無償で訂正・削除します。
  6. 各試験の運営団体とは無関係の非公式教材です。合格を保証するものではありません。
この分野をもっと解いて、得点源に
java.time を含む問題を分野別に演習できます。
演習する →