Javaにおけるレガシーな日時操作:Date、SimpleDateFormat、Calendarの活用

Dateクラス:日時情報の保持

java.util.Dateは、特定の時点(ミリ秒精度)を表すクラスです。JDK 1.1以降、多くのメソッドが非推奨(Deprecated)となりましたが、現在でもデータの保持や古いライブラリとの連携において利用されています。

コンストラクタ 説明
Date() 実行時のシステム時刻でインスタンスを生成します。
Date(long date) 1970年1月1日 00:00:00 GMTからの経過ミリ秒を指定して生成します。
主要メソッド 説明
long getTime() エポックタイムからの経過ミリ秒を返します。
void setTime(long time) ミリ秒値を指定して、オブジェクトが指す日時を更新します。

SimpleDateFormatクラス:書式設定と解析

SimpleDateFormatは、Dateオブジェクトを人間が読みやすい文字列に変換(フォーマット)したり、逆に文字列をDateオブジェクトに変換(パース)したりするために使用されます。

主要なパターン文字

  • y: 年
  • M: 月
  • d: 日
  • H: 時 (0-23)
  • m: 分
  • s: 秒
  • E: 曜日
  • a: 午前/午後
// 日時を指定したフォーマットで出力する例
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss E");
Date now = new Date();
String formattedText = formatter.format(now);
System.out.println(formattedText); // 例: 2024/05/10 14:30:15 金

応用:経過日数の計算

ユーザーが入力した誕生日から、現在までの経過日数を計算するロジックの例です。

public void calculateLifeStats(String birthInput) throws ParseException {
    // 入力形式を定義
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    
    // 文字列をDate型に変換
    Date birthDate = sdf.parse(birthInput);
    Date today = new Date();
    
    // 差分(ミリ秒)を取得
    long diffInMillis = today.getTime() - birthDate.getTime();
    
    // 単位変換
    long daysLived = diffInMillis / (1000L * 60 * 60 * 24);
    long approximateYears = daysLived / 365;
    
    System.out.println("生誕から " + daysLived + " 日が経過しました。");
    System.out.println("およそ " + approximateYears + " 歳です。");
}

Calendarクラス:日時の操作とフィールド抽出

Calendarは抽象クラスであり、特定のカレンダーシステム(主にグレゴリオ暦)に基づいた日時操作を提供します。年、月、日などの特定のフィールドを個別に取得・変更する際に適しています。

インスタンスの取得と値の取得

Calendar.getInstance()を使用して、ロケールやタイムゾーンに基づいたインスタンスを取得します。

Calendar cal = Calendar.getInstance();

int year = cal.get(Calendar.YEAR);
// 月は0から始まるため、+1が必要
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);

System.out.println(year + "年" + month + "月" + day + "日");

日時の設定と加減算

setメソッドで特定の値を設定し、addメソッドで時間の進退を計算します。

Calendar calendar = Calendar.getInstance();

// 特定の日時を設定 (2025年12月25日)
calendar.set(2025, Calendar.DECEMBER, 25);

// 10日後を計算
calendar.add(Calendar.DAY_OF_MONTH, 10);
System.out.println("10日後の日付: " + calendar.getTime());

// 2ヶ月前を計算
calendar.add(Calendar.MONTH, -2);
System.out.println("2ヶ月前の日付: " + calendar.getTime());

注意点として、Calendar.MONTHは「0」が1月を表す仕様であるため、定数(Calendar.JANUARYなど)を使用することで可読性を高めることができます。また、週の始まりは地域設定に依存しますが、一般的に日曜が「1」として扱われます。

タグ: Java Date Calendar SimpleDateFormat

8月21日 02:47 投稿