Javaの日時操作:文字列解析からCalendarクラス活用まで

Javaプログラミングにおける日時処理は、多くのアプリケーションで不可欠な機能です。この記事では、文字列から日時オブジェクトへの変換、スレッドの一時停止、時間間隔の測定、そして強力なCalendarクラスの使用方法について詳しく解説します。

文字列を日時オブジェクトに変換する

SimpleDateFormatクラスのparse()メソッドを使用すると、指定されたパターンに従って文字列をDateオブジェクトに変換できます。以下に実装例を示します:

import java.util.*;
import java.text.*;

public class DateTimeParser {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String dateInput = args.length > 0 ? args[0] : "2023-12-25";
        
        try {
            LocalDate parsedDate = LocalDate.parse(dateInput, dtf);
            System.out.println("入力文字列: " + dateInput);
            System.out.println("変換結果: " + parsedDate);
        } catch (DateTimeParseException ex) {
            System.err.println("パースエラー: " + ex.getMessage());
        }
    }
}

実行結果:

$ java DateTimeParser 2024-03-15
入力文字列: 2024-03-15
変換結果: 2024-03-15

スレッドの一時停止処理

Thread.sleep()メソッドを使用して、現在のスレッドを指定した時間だけ一時停止できます。これにより、CPUリソースを他のスレッドに譲ることができます。次の例では2.5秒間の休止を実装しています:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class ThreadPauseDemo {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss.SSS");
        
        System.out.println("開始時刻: " + LocalDateTime.now().format(formatter));
        
        try {
            Thread.sleep(2500); // 2.5秒間休止
        } catch (InterruptedException e) {
            System.err.println("休止が中断されました");
        }
        
        System.out.println("終了時刻: " + LocalDateTime.now().format(formatter));
    }
}

実行結果の例:

開始時刻: 14:23:45.123
終了時刻: 14:23:47.623

処理時間の精密測定

System.nanoTime()を使用すると、ナノ秒単位での時間測定が可能です。これにより、パフォーマンス分析やボトルネックの特定に役立ちます。以下の例では配列ソートの処理時間を測定しています:

import java.util.Arrays;
import java.util.Random;

public class PerformanceMeasurement {
    public static void main(String[] args) {
        int[] data = new Random().ints(100000, 1, 1000).toArray();
        
        long startTime = System.nanoTime();
        Arrays.sort(data);
        long endTime = System.nanoTime();
        
        double duration = (endTime - startTime) / 1_000_000.0;
        System.out.printf("ソート処理時間: %.3f ミリ秒%n", duration);
    }
}

Calendarクラスによる柔軟な日時操作

Calendarクラスは、日時の各要素(年、月、日、時など)を個別に操作するための強力な機能を提供します。Dateクラスに比べてはるかに柔軟な操作が可能です。

Calendarインスタンスの生成方法

// 現在日時のCalendarインスタンス
Calendar current = Calendar.getInstance();

// 特定日時のCalendarインスタンス
Calendar specific = Calendar.getInstance();
specific.set(2024, Calendar.MAY, 20, 15, 30, 0);

主要なフィールド定数

定数意味
Calendar.YEAR
Calendar.MONTH月(0-11)
Calendar.DAY_OF_MONTH
Calendar.HOUR_OF_DAY時(24時間制)
Calendar.MINUTE
Calendar.SECOND
Calendar.DAY_OF_WEEK曜日(1=日曜)

日時要素の設定と変更

Calendar cal = Calendar.getInstance();

// setメソッドによる設定
cal.set(Calendar.YEAR, 2025);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);

// addメソッドによる加減算
cal.add(Calendar.DAY_OF_MONTH, 10);  // 10日後
cal.add(Calendar.MONTH, -2);         // 2ヶ月前

日時要素の取得

Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1; // 1月を1とするため+1
int day = cal.get(Calendar.DAY_OF_MONTH);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int weekday = cal.get(Calendar.DAY_OF_WEEK);

GregorianCalendarクラスの詳細

GregorianCalendarはCalendarクラスの具体的な実装で、グレゴリオ暦を扱います。Calendar.getInstance()はデフォルトでGregorianCalendarのインスタンスを返します。

GregorianCalendarのコンストラクタ

// デフォルトコンストラクタ
GregorianCalendar gc1 = new GregorianCalendar();

// 日付のみ指定
GregorianCalendar gc2 = new GregorianCalendar(2024, Calendar.MARCH, 15);

// 日時を指定
GregorianCalendar gc3 = new GregorianCalendar(2024, Calendar.MARCH, 15, 14, 30);

// ロケールを指定
GregorianCalendar gc4 = new GregorianCalendar(Locale.JAPAN);

実用的なメソッドの使用例

import java.util.*;

public class GregorianCalendarExample {
    public static void main(String[] args) {
        GregorianCalendar cal = new GregorianCalendar(2024, Calendar.FEBRUARY, 29);
        
        // 閏年の判定
        boolean isLeap = cal.isLeapYear(2024);
        System.out.println("2024年は閏年: " + isLeap);
        
        // 月の最大日数
        int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println("2月の最大日数: " + maxDay);
        
        // 年初からの日数
        int dayOfYear = cal.get(Calendar.DAY_OF_YEAR);
        System.out.println("年初からの日数: " + dayOfYear);
        
        // 週の最初の曜日(日本では日曜)
        int firstDayOfWeek = cal.getFirstDayOfWeek();
        System.out.println("週の最初の曜日: " + firstDayOfWeek);
    }
}

このようにCalendarクラスとGregorianCalendarクラスを活用することで、Javaで複雑な日時計算や操作を効率的に行うことができます。

6月9日 20:57 投稿