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で複雑な日時計算や操作を効率的に行うことができます。