コース一覧
    Java中級:文字列・日付・標準ライブラリ
    Duration で時間差を計算

    Java中級:文字列・日付・標準ライブラリ

    文字列・日付・時刻と標準ライブラリを学び、よく使うデータ加工や日時処理を適切に実装できるようにします。

    1
    文字列操作
    01. String.format で書式化5分
    02. StringBuilder で連結5分
    03. 正規表現の基本5分
    04. split と join5分
    05. 文字列操作 まとめクイズ5分
    2
    日付と時刻
    01. LocalDate で日付を扱う5分
    02. LocalDateTime で時刻も扱う5分
    03. Duration で時間差を計算5分
    04. 日付の書式化とパース5分
    05. 日付の加減算5分
    06. 日付と時刻 まとめクイズ5分

    Duration で時間差を計算

    日数の差を引き算で出すと、月をまたいだ瞬間に合わなくなる

    「登録から 30 日たった人にメールを送る」「予約日まであと何日か表示する」。日付の差を数える処理は、業務アプリでいくらでも出てきます。ところが 日 の値どうしを引き算する方法は、同じ月の中でしか通用しません。月をまたげば月の長さを足す必要があり、年をまたげばうるう年かどうかまで自分で判定するはめになります。

    java.time には、2 点間の差を単位ごとに数えてくれる ChronoUnit があります。DAYS HOURS MINUTES MONTHS YEARS といった単位を選び、between に始点と終点を渡すだけです。

    Java

    import java.time.LocalDate;
    import java.time.temporal.ChronoUnit;
    
    public class Demo {
        public static void main(String[] args) {
            LocalDate open = LocalDate.of(2026, 4, 1);
            LocalDate deadline = LocalDate.of(2026, 5, 19);
    
            long days = ChronoUnit.DAYS.between(open, deadline);
            System.out.println(days);   // 48
        }
    }

    4 月が 30 日までであることも、月がまたがっていることも、こちら側では一切考えていません。うるう年をまたいでも同じように正しい値が返ります。

    3 時間半のはずが 3 と返ってくる

    between は「その単位が何回まるごと入るか」を数えるので、端数は切り捨てられます。9 時から 12 時 30 分までを HOURS で聞くと 3 です。

    Java

    import java.time.LocalDateTime;
    import java.time.temporal.ChronoUnit;
    
    LocalDateTime start = LocalDateTime.of(2026, 4, 1, 9, 0);
    LocalDateTime end   = LocalDateTime.of(2026, 4, 1, 12, 30);
    
    System.out.println(ChronoUnit.MINUTES.between(start, end)); // 210
    System.out.println(ChronoUnit.HOURS.between(start, end));   // 3

    3.5 が欲しいわけではなく「何時間何分か」を知りたいのなら、細かい単位で取ってから自分で組み立てます。上の例なら 210 分を 60 で割って商と余りを出せば、3 時間 30 分になります。

    引数を入れ替えると符号が反転する

    between(start, end) が返すのは end から start を引いた値です。つまり start のほうが未来なら結果は負になります。

    Java

    LocalDate open = LocalDate.of(2026, 4, 1);
    LocalDate deadline = LocalDate.of(2026, 5, 19);
    
    System.out.println(ChronoUnit.DAYS.between(deadline, open)); // -48

    これは不具合ではなく仕様です。「締め切りを過ぎているかどうか」を判定したいなら符号がそのまま答えになりますし、単に日数だけ知りたいなら Math.abs で絶対値を取ります。過去か未来かの情報を捨てる前に、本当に捨てていいのか一度考えてください。

    解説

    between の戻り値は long です。int の変数に入れたいときは (int) で明示的にキャストします。int は約 21 億まで扱えて、日数に直すと 580 万年を超えるので、日付の差であふれる心配はまずありません。

    やってみよう

    Solution.daysBetween(int year1, int month1, int day1, int year2, int month2, int day2) を完成させます。

    1. import java.time.LocalDate; と import java.time.temporal.ChronoUnit; を書く
    2. 受け取った 6 つの数値から LocalDate を 2 つ作る
    3. 日数の差を求め、int に変換して return する

    daysBetween(2026, 5, 1, 2026, 5, 19) は 18、daysBetween(2026, 5, 19, 2026, 5, 1) は -18 です。順番を逆にしたときに負の値が返ることまで確認されるので、絶対値を取ってはいけません。

    要件

    1. ファイル先頭で import java.time.LocalDate; と import java.time.temporal.ChronoUnit; を書くこと
    2. LocalDate.of(year, month, day) を 2 回呼んで 2 つの LocalDate を作ること
    3. ChronoUnit.DAYS.between(d1, d2) の戻り値 (long) を (int) でキャストして返すこと

    ヒント

    `ChronoUnit.DAYS.between(d1, d2)` は `d2 - d1` を返します。引数順を逆にすると符号が反転します

    `Period.between(d1, d2).getDays()` は「年月を除いた日」の値を返すので、合計日数を取りたい今回の課題には不向きです。必ず `ChronoUnit.DAYS.between` を使いましょう

    戻り値の型は `int` ですが `ChronoUnit.DAYS.between` の戻り値は `long` なので、`return (int) ChronoUnit.DAYS.between(d1, d2);` のようにキャストが必要です

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

    関連レッスン

    • 日付の書式化とパース

      DateTimeFormatter.ofPattern() で LocalDate を任意の書式に変換し、逆に文字列から日付へ parse する方法を学ぼう。

    • 日付の加減算

      LocalDate の plusDays や minusDays を使って日付を前後に動かす方法を学び、不変オブジェクトとしての扱い方を身につけよう。

    • 日付と時刻 まとめクイズ

      Java 8 で導入された java.time パッケージ (LocalDate / LocalDateTime / Duration / Period / DateTimeFormatter / 加減算) の総まとめ。不変性 (immutable)、ChronoUnit、parse/format の対称性など実務頻出のポイントを 4 択クイズで確認する。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 処理計算や代入を表す長方形
    • 引数位置引数=順番で渡す。
    • 戻り値呼び出し元への返答を表す点線矢印
    • 変数データに名前をつけて参照する仕組み
    • instanceof「このオブジェクトの実際の型は何か」を確認 → 安全に変換
    main.java
    エディタを読み込んでいます

    メモ

    Duration で時間差を計算

    ⌘S で保存