Menu
CoddyTech

Period と Duration

CoddyのJavaジャーニー「ロジックとフロー」セクションの一部。レッスン 57/59。

Periodは日付ベースの期間(年、月、日)を表し、Durationは時間ベースの期間(時、分、秒)を表します。

期間を作成する:

Period period = Period.of(1, 2, 15);
// 1年、2か月、15日

Durationを作成します:

Duration duration = Duration.ofHours(2);
// 2時間
Duration minutes = Duration.ofMinutes(90);
// 90分

上記のコードを実行すると、periodには次の値が含まれます:

P1Y2M15D  // ISO-8601形式

Period.between()を使って2つの日付の間隔を測ります。2つのLocalDate値を受け取り、その間隔を年、月、日に分割します:

LocalDate start = LocalDate.of(2024, 1, 15);
LocalDate end = LocalDate.of(2025, 3, 20);
Period p = Period.between(start, end);
p.getYears();   // 1
p.getMonths();  // 2
p.getDays();    // 5

getDays()が返すのは、満年数と満月数を差し引いた残りの日数だけであり、2つの日付の間の合計日数ではありません。LocalDateTimeからはtoLocalDate()で日付を取得できます。

Duration.between()を使って2つの時刻の差を測定します。このメソッドは2つのLocalDateTime(またはLocalTime)の値を受け取ります。

LocalDateTime from = LocalDateTime.of(2024, 3, 15, 10, 30);
LocalDateTime to = LocalDateTime.of(2024, 3, 15, 14, 45);
Duration d = Duration.between(from, to);
d.toHours();        // 4
d.toMinutes();      // 255
d.toMinutesPart();  // 15

toMinutes()は、時間も含めた差全体を分単位で数えます。toMinutesPart()は、時間単位の分を差し引いた残りの分を返すので、この差は4時間15分です。

challenge icon

チャレンジ

簡単

calculateDifferenceという名前のメソッドを作成し、次の4つの引数を受け取るようにします。

  1. 形式が "yyyy-MM-dd HH:mm" の文字列(start)
  2. 形式が "yyyy-MM-dd HH:mm" の文字列(end)
  3. "period" または "duration" のいずれかの文字列(unit)
  4. "full" または "simple" のいずれかの文字列(format)

このメソッドは次の処理を行います。

  1. 開始日時と終了日時の差を計算する
  2. 指定された形式で差を返す

返すメッセージは次のとおりです。

  • 日付が無効な場合:"Invalid date format" を返す
  • 単位が無効な場合:"Invalid unit" を返す
  • 形式が無効な場合:"Invalid format" を返す
  • "full" 形式の期間の場合:"Years: X, Months: Y, Days: Z"
  • "simple" 形式の期間の場合:"XyYmZd"
  • "full" 形式の時間の場合:"Hours: X, Minutes: Y"。Y は、時間全体を差し引いた後の分数です。
  • "simple" 形式の時間の場合:"XhYm"

自分で試してみよう

import java.util.Scanner;
import java.time.*;
import java.time.format.*;

public class Main {
    public static String calculateDifference(String start, String end, String unit, String format) {
        // ここにコードを書いてください
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String start = scanner.nextLine();
        String end = scanner.nextLine();
        String unit = scanner.nextLine();
        String format = scanner.nextLine();
        
        System.out.println(calculateDifference(start, end, unit, format));
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: Javaオンラインコンパイラ