Java Date クラス

Java のDateクラスはjava.utilパッケージ内にあり、特定の瞬間をミリ秒精度で表します。

Date クラスは主に日付と時刻の情報を表すために使用され、Java で日付と時刻を扱うための基本クラスの1つです。

注意すべき点は、Java 8 以降に新しい日時 API が導入されたことです (java.timeパッケージ)。これはDateクラスよりも強力で使いやすいです。ただし、多くのレガシーコードでは、依然としてDateクラスの使用が見られます。


Date クラスの基本使用

Date オブジェクトの作成

Date クラスには複数のコンストラクタがあり、最もよく使われるのは次の2つです:

例

// 現在時刻を表す Date オブジェクトを作成
Date currentDate = new Date();

// 指定した時刻の Date オブジェクトを作成 (1970年1月1日00:00:00 GMTからのミリ秒数)
Date specificDate = new Date(1640995200000L); // 2022年1月1日00:00:00 GMT

よく使われるメソッド

Date クラスにはいくつかのよく使われるメソッドがあります:

例

Date date = new Date();

// 1970年1月1日00:00:00 GMT からのミリ秒数を取得
long timeInMillis = date.getTime();

// 時刻を設定 (1970年1月1日00:00:00 GMTからのミリ秒数)
date.setTime(1640995200000L);

// 2つの日付を比較
Date anotherDate = new Date();
int result = date.compareTo(anotherDate); // 小さい場合は-1、等しい場合は0、大きい場合は1を返す

// 日付が指定日より後かどうかをチェック
boolean isAfter = date.after(anotherDate);

// 日付が指定日より前かどうかをチェック
boolean isBefore = date.before(anotherDate);

Date クラスのフォーマット

Date クラス自体にはフォーマット機能はありませんが、SimpleDateFormatクラスを使用して日付のフォーマットと解析ができます。

日付フォーマットの例

例

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatExample {
    public static void main(String[] args) {
        Date date = new Date();
       
        // フォーマットオブジェクトを作成
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 E HH时mm分ss秒");
       
        // 日付をフォーマット
        String formattedDate1 = sdf1.format(date);
        String formattedDate2 = sdf2.format(date);
       
        System.out.println("格式1: " + formattedDate1);
        System.out.println("格式2: " + formattedDate2);
    }
}

出力結果は:

格式1: 2025-05-01 11:33:43
格式2: 2025年05月01日 周四 11时33分43秒

よく使われるフォーマットパターン

文字 意味 例
y 年 yyyy → 2023
M 月 MM → 01, MMM → Jan
d 日 dd → 05
H 時 (24時間制) HH → 13
h 時 (12時間制) hh → 01
m 分 mm → 30
s 秒 ss → 45
S ミリ秒 SSS → 789
E 曜日 E → 月曜日
a 午前/午後のマーク a → 午後

総合例

以下は Date の簡単な例です:

例

import java.util.Date;
import java.text.SimpleDateFormat;

public class DateDemo {
    public static void main(String[] args) {
        // 1. 現在時刻を表す Date オブジェクトを作成
        Date now = new Date();
        System.out.println("当前时间: " + now);
       
        // 2. 特定の時刻の Date オブジェクトを作成(非推奨メソッド)
        @SuppressWarnings("deprecation")
        Date oldDate = new Date(123, 4, 15); // 2023年5月15日(月は0-11)
        System.out.println("特定日期: " + oldDate);
       
        // 3. タイムスタンプを使用して Date オブジェクトを作成(推奨方法)
        Date dateFromTimestamp = new Date(1684131330000L); // 2023-05-15 10:15:30
        System.out.println(タイムスタンプから作成: + dateFromTimestamp);
       
        // 4. 日付をフォーマットして出力
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formattedDate = sdf.format(now);
        System.out.println("格式化日期: " + formattedDate);
       
        // 5. 文字列を Date に解析
        try {
            Date parsedDate = sdf.parse("2023-05-15 10:30:00");
            System.out.println(解析後の日付: + parsedDate);
        } catch (Exception e) {
            e.printStackTrace();
        }
       
        // 6. タイムスタンプを取得
        long timestamp = now.getTime();
        System.out.println("时间戳: " + timestamp);
       
        // 7. 日付の比較
        System.out.println("now は dateFromTimestamp より後か: " + now.after(dateFromTimestamp));
        System.out.println("now は dateFromTimestamp より前か: " + now.before(dateFromTimestamp));
    }
}

出力結果は:

当前时间: Thu May 01 11:33:05 CST 2025
特定日期: Mon May 15 00:00:00 CST 2023
从时间戳创建: Mon May 15 14:15:30 CST 2023
格式化日期: 2025-05-01 11:33:05
解析后的日期: Mon May 15 10:30:00 CST 2023
时间戳: 1746070385401
now 是否在 dateFromTimestamp 之后: true
now 是否在 dateFromTimestamp 之前: false

Date クラスの限界

Date クラスは多くの場合でまだ使用できますが、いくつか明らかな限界があります:

  1. スレッドセーフではない:Date オブジェクトは可変であり、マルチスレッド環境では問題が発生する可能性があります。
  2. 設計が良くない:月は0始まり(0は1月)で、年は1900年からの計算になるため、混乱を招きやすいです。
  3. タイムゾーンの処理が複雑:Date クラス自体にはタイムゾーン情報が含まれておらず、タイムゾーンの処理には追加のクラスが必要です。
  4. 機能が限られている:日数の加減算や週数など、よく使われる日付操作機能の多くが不足しています。

代替案:Java 8 日時 API

Java 8 では新しい日時 API が導入されました (java.timeパッケージ)。これは Date クラスの多くの問題を解決しました:

例

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

public class NewDateTimeExample {
    public static void main(String[] args) {
        // 現在の日時を取得
        LocalDateTime now = LocalDateTime.now();
       
        // フォーマット
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formattedDateTime = now.format(formatter);
       
        System.out.println("当前时间: " + formattedDateTime);
    }
}

新しい日時 API はより多くの機能を提供します。例えば:

  • LocalDate- 日付のみを含む
  • LocalTime- 時刻のみを含む
  • LocalDateTime- 日付と時刻を含む
  • ZonedDateTime- 日付、時刻、タイムゾーンを含む
  • 豊富な日付操作メソッド

まとめ

  1. Dateクラスは Java で日付と時刻を表す基本クラスですが、いくつか制限があります。
  2. 使用SimpleDateFormatすることで日付文字列のフォーマットと解析ができます。
  3. Java 8 以降では、新しいjava.timeAPI を使用してDateクラスの代替とすることをお勧めします。
  4. 古いコードを保守する際には、Dateクラスを理解することが依然として重要です。

新しいプロジェクトを開発している場合は、Java 8 の新しい日時 API の使用を優先的に検討することをお勧めします。より直感的で強力かつスレッドセーフです。

以下は java.util.Date クラスのよく使われるメソッドです:

コンストラクタ

メソッド 説明 備考
Date() 現在時刻を表す Date オブジェクトを作成する 非推奨であり、推奨されるのはnew Date()或Calendar.getInstance()
Date(long date) 指定したミリ秒数に基づいて Date オブジェクトを作成する ミリ秒数は1970年1月1日00:00:00 GMTからの経過時間です

よく使われるメソッド

メソッド 説明 備考
boolean after(Date when) この日付が指定日より後かどうかをテストする
boolean before(Date when) この日付が指定日より前かどうかをテストする
Object clone() このオブジェクトのコピーを返す
int compareTo(Date anotherDate) 2つの日付の順序を比較する
boolean equals(Object obj) 2つの日付の等価性を比較する
long getTime() 1970年1月1日からのミリ秒数を返す
void setTime(long time) 指定したミリ秒数でこの Date オブジェクトを設定する
String toString() Date オブジェクトを文字列表現に変換する 形式例:"Tue Jun 22 13:07:00 CST 2021"

非推奨メソッド(推奨されない)

メソッド 説明 代替案
int getDate() 月の日を取得 (1-31) を使用Calendar.get(Calendar.DATE)
int getDay() 曜日を取得 (0-6) を使用Calendar.get(Calendar.DAY_OF_WEEK)
int getHours() 時を取得 (0-23) を使用Calendar.get(Calendar.HOUR_OF_DAY)
int getMinutes() 分を取得 (0-59) を使用Calendar.get(Calendar.MINUTE)
int getMonth() 月を取得 (0-11) を使用Calendar.get(Calendar.MONTH)
int getSeconds() 秒を取得 (0-59) を使用Calendar.get(Calendar.SECOND)
int getYear() 年を取得 (1900年から) を使用Calendar.get(Calendar.YEAR)
void setDate(int date) 月の日を設定する を使用Calendar.set(Calendar.DATE, date)
void setHours(int hours) 時を設定する を使用Calendar.set(Calendar.HOUR_OF_DAY, hours)
void setMinutes(int minutes) 分を設定する を使用Calendar.set(Calendar.MINUTE, minutes)
void setMonth(int month) 月を設定する を使用Calendar.set(Calendar.MONTH, month)
void setSeconds(int seconds) 秒を設定する を使用Calendar.set(Calendar.SECOND, seconds)
void setYear(int year) 年を設定する を使用Calendar.set(Calendar.YEAR, year)
その他の拡張