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日まで)
- A
1 1改行29 - B
1 1改行28 - C
0 29改行29 - D
1 0改行29
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:A✓Gold監修
解説
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。
- C
Periodを「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
✓Gold 保有者による書き下ろし解説・実機で検証済