Java SimpleDateFormat クラス
SimpleDateFormatJava で日付と時刻をフォーマットおよび解析するためのクラスであり、java.textパッケージに属します。これにより、日付オブジェクト(Date)を特定の形式の文字列に変換したり、フォーマットされた日付文字列を解析して日付オブジェクトに戻したりすることができます。
基本的な使い方
1. SimpleDateFormat オブジェクトの作成
使用するにはSimpleDateFormat、まずインスタンスを作成し、日付書式パターンを指定する必要があります:
例
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
// SimpleDateFormat オブジェクトを作成し、書式を指定
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 現在の日時を取得
Date now = new Date();
// 日付を文字列にフォーマット
String formattedDate = sdf.format(now);
System.out.println("当前时间: " + formattedDate);
}
}
import java.util.Date;
public class Main {
public static void main(String[] args) {
// SimpleDateFormat オブジェクトを作成し、書式を指定
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 現在の日時を取得
Date now = new Date();
// 日付を文字列にフォーマット
String formattedDate = sdf.format(now);
System.out.println("当前时间: " + formattedDate);
}
}
出力結果は次のとおりです:
当前时间: 2025-05-01 11:35:07
2. 一般的な書式パターン記号
以下は一般的な書式パターン記号です:
| 記号 | 意味 | 例 |
|---|---|---|
| yyyy | 4桁の年 | 2023 |
| MM | 2桁の月 | 01-12 |
| dd | 2桁の日 | 01-31 |
| HH | 24時間制の時 | 00-23 |
| mm | 分 | 00-59 |
| ss | 秒 | 00-59 |
| E | 曜日 | Mon, Tue など |
| a | AM/PM マーク | AM または PM |
日付のフォーマット
将 Dateオブジェクトを文字列にフォーマット:
例
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 EEEE a hh:mm:ss");
Date now = new Date();
System.out.println(sdf.format(now));
// 出力例: 2023年11月15日 水曜日 午後 03:45:22
Date now = new Date();
System.out.println(sdf.format(now));
// 出力例: 2023年11月15日 水曜日 午後 03:45:22
日付の解析
フォーマットされた日付文字列を解析してDateオブジェクト:
例
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateString = "2023-11-15";
Date date = sdf.parse(dateString);
System.out.println(date);
// 出力: Wed Nov 15 00:00:00 CST 2023
} catch (ParseException e) {
e.printStackTrace();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateString = "2023-11-15";
Date date = sdf.parse(dateString);
System.out.println(date);
// 出力: Wed Nov 15 00:00:00 CST 2023
} catch (ParseException e) {
e.printStackTrace();
}
注意:解析時にスローされる可能性がありますParseException、例外処理が必要です。
スレッドセーフティの問題
SimpleDateFormatスレッドセーフではありません。マルチスレッド環境で同じSimpleDateFormatインスタンスを共有すると、問題が発生する可能性があります。解決策:
- 使用するたびに新しいインスタンスを作成する(パフォーマンスが低い)
- を使用して
ThreadLocalスレッドごとにインスタンスを保存する - Java 8 の
DateTimeFormatter(推奨)
例
// ThreadLocal を使用した解決策
private static final ThreadLocal<SimpleDateFormat> dateFormat =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
// 使用方法
String formattedDate = dateFormat.get().format(new Date());
private static final ThreadLocal<SimpleDateFormat> dateFormat =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
// 使用方法
String formattedDate = dateFormat.get().format(new Date());
Java 8 の代替案
Java 8 以降では、... を使用することをお勧めしますjava.timeパッケージ内のクラス:
例
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// フォーマッタを作成
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 現在の時刻を取得してフォーマット
LocalDateTime now = LocalDateTime.now();
String formattedDate = now.format(formatter);
System.out.println("当前时间: " + formattedDate);
// 文字列を日時として解析
LocalDateTime parsedDate = LocalDateTime.parse("2023-11-15 14:30:00", formatter);
System.out.println(解析後の時間: + parsedDate);
}
}
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// フォーマッタを作成
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 現在の時刻を取得してフォーマット
LocalDateTime now = LocalDateTime.now();
String formattedDate = now.format(formatter);
System.out.println("当前时间: " + formattedDate);
// 文字列を日時として解析
LocalDateTime parsedDate = LocalDateTime.parse("2023-11-15 14:30:00", formatter);
System.out.println(解析後の時間: + parsedDate);
}
}
DateTimeFormatterスレッドセーフで、パフォーマンスが優れているため、新しいプロジェクトでの使用をお勧めします。
まとめ
SimpleDateFormat日付のフォーマットと解析に使用される- パターン文字列で日付形式を指定する
- スレッドセーフではないため、マルチスレッド環境での使用に注意が必要
- Java 8 以降のバージョンでの使用を推奨
DateTimeFormatter
をマスターすることでSimpleDateFormat、Java プログラムでさまざまな日時形式の変換ニーズを柔軟に処理できます。
以下は java.text.SimpleDateFormat クラスの一般的なメソッドです:
コンストラクタ
| メソッド | 説明 |
|---|---|
SimpleDateFormat() |
デフォルトのパターンとデフォルトのロケールの日付書式記号を使用してオブジェクトを構築する |
SimpleDateFormat(String pattern) |
指定されたパターンとデフォルトのロケールの日付書式記号を使用してオブジェクトを構築する |
SimpleDateFormat(String pattern, Locale locale) |
指定されたパターンと指定されたロケールの日付書式記号を使用してオブジェクトを構築する |
一般的な書式パターン記号
| 記号 | 意味 | 例 |
|---|---|---|
y |
年 | yyyy → 2023 |
M |
月 | MM → 07, MMM → Jul, MMMM → July |
d |
月内の日数 | dd → 15 |
H |
時 (0-23) | HH → 14 |
h |
時 (1-12) | hh → 02 |
m |
分 | mm → 30 |
s |
秒 | ss → 45 |
S |
ミリ秒 | SSS → 789 |
E |
曜日 | EEE → Mon, EEEE → Monday |
a |
AM/PM マーク | a → PM |
z |
タイムゾーン | z → CST, zzzz → China Standard Time |
主要メソッド
| メソッド | 説明 |
|---|---|
String format(Date date) |
Date を日付/時刻文字列にフォーマットする |
Date parse(String source) |
文字列からテキストを解析して Date オブジェクトを生成する |
void applyPattern(String pattern) |
新しい日時パターンを適用する |
String toPattern() |
現在の日時パターン文字列を返す |
void setTimeZone(TimeZone zone) |
タイムゾーンを設定する |
TimeZone getTimeZone() |
タイムゾーンを取得する |
void setLenient(boolean lenient) |
解析を寛容にするかどうかを設定(デフォルトは true) |
boolean isLenient() |
寛容な解析かどうかを判定する |