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 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);
// 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);
}
}
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));
}
}
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 クラスは多くの場合でまだ使用できますが、いくつか明らかな限界があります:
- スレッドセーフではない:Date オブジェクトは可変であり、マルチスレッド環境では問題が発生する可能性があります。
- 設計が良くない:月は0始まり(0は1月)で、年は1900年からの計算になるため、混乱を招きやすいです。
- タイムゾーンの処理が複雑:Date クラス自体にはタイムゾーン情報が含まれておらず、タイムゾーンの処理には追加のクラスが必要です。
- 機能が限られている:日数の加減算や週数など、よく使われる日付操作機能の多くが不足しています。
代替案: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);
}
}
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- 日付、時刻、タイムゾーンを含む- 豊富な日付操作メソッド
まとめ
Dateクラスは Java で日付と時刻を表す基本クラスですが、いくつか制限があります。- 使用
SimpleDateFormatすることで日付文字列のフォーマットと解析ができます。 - Java 8 以降では、新しい
java.timeAPI を使用してDateクラスの代替とすることをお勧めします。 - 古いコードを保守する際には、
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) |