Java 開発において、日付および時刻の適切な処理はシステム要件を満たすために不可欠です。日付オブジェクトを人間が読める形式の文字列に変換したり、逆に文字列データから日付オブジェクトを生成したりする操作は、多くのビジネスロジックで必要となります。本稿では、Java 標準ライブラリを用いた日付のフォーマット設定と解析手法について解説します。
SimpleDateFormat クラスの活用
従来の Java 環境では、java.text.SimpleDateFormat クラスを用いて日付の書式設定を行うのが一般的です。このクラスを利用することで、任意のパターンに基づいて java.util.Date オブジェクトを文字列へ変換できます。以下のコード例は、現在時刻を特定の形式で出力する実装です。
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTimeUtilDemo {
public static void main(String[] args) {
// 現在時刻を取得
Date targetDate = new Date();
// フォーマッタのインスタンス生成(パターン指定)
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
// 文字列へ変換
String result = formatter.format(targetDate);
System.out.println("Formatted: " + result);
}
}
上記の実行結果は、例えば「Formatted: 2024/02/05 13:44:08」のようになります。コンストラクタに渡す文字列パターンによって、出力される日付の見た目を自由に制御することが可能です。
主要なパターン文字一覧
SimpleDateFormat では、特定のアルファベット文字が予約されており、それぞれが日付の構成要素を表します。主な記号とその意味は以下の通りです。
- y: 年(例:2024)
- M: 月(例:02)
- d: 日(例:05)
- H: 時間(0-23)
- h: 時間(1-12)
- m: 分
- s: 秒
- S: ミリ秒
- E: 曜日(例:Mon)
- z: タイムゾーン
これらの文字を組み合わせることで、「yyyy 年 MM 月 dd 日」のような日本語形式や、「yyyyMMddHHmmss」のようなシステム連携用の形式など、多様なパターンを構築できます。
文字列から日付オブジェクトへの解析
フォーマット機能に加え、このクラスは文字列を日付オブジェクトへ戻す解析機能も提供しています。parse() メソッドを使用し、対象の文字列と一致するパターンを指定することで変換が行われます。例外処理が必要な点に注意してください。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class StringToDateParser {
public static void main(String[] args) {
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String input = "2024-02-05 13:44:08";
try {
Date parsedDate = parser.parse(input);
System.out.println("Parsed: " + parsedDate);
} catch (ParseException ex) {
System.err.println("日付形式が一致しません");
}
}
}
この処理により、データベースや外部 API から取得した文字列形式の日付データを、Java 内部で処理可能な Date オブジェクトへ変換できます。
スレッド安全性と現代的なアプローチ
SimpleDateFormat のインスタンスは内部状態を持つため、スレッドセーフではありません。複数のスレッドから同時に同じインスタンスを参照してフォーマットや解析を行うと、予期せぬ結果や例外が発生する可能性があります。マルチスレッド環境で使用する場合は、スレッドごとにインスタンスを生成するか、ThreadLocal で管理する必要があります。
より堅牢な実装を目指すのであれば、Java 8 で導入された java.time パッケージの利用を推奨します。DateTimeFormatter クラスは不変であり线程安全であるため、共有インスタンスとして安全に利用可能です。新規開発では、旧来の API ではなく DateTimeFormatter を採用することが望ましい設計方針となります。