「日時→文字列」は“見せ方を決める”作業
日時オブジェクト(LocalDate や LocalDateTime など)は、
そのままだと「内部的に意味のある値」ですが、人間には少し分かりにくいことがあります。
画面表示、CSV 出力、ログ出力、帳票などでは、
「どんな見た目の文字列で出すか」をきちんと決める必要があります。
その“見せ方”をコントロールするのがDateTimeFormatter を使った「日時→文字列」変換です。
ここを押さえておくと、
「どこでも同じフォーマットで出せる」「仕様変更にも強い」コードになります。
基本の道具:DateTimeFormatter と format
DateTimeFormatter の役割
DateTimeFormatter は、
「このパターンで日時を文字列にする」という“型紙”です。
例えば"yyyy/MM/dd" なら「2025/03/26」、"yyyy-MM-dd HH:mm:ss" なら「2025-03-26 09:30:00」
という形で出力できます。
日時オブジェクト側の format メソッドに渡して使います。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class FormatBasicExample {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.of(2025, 3, 26, 9, 30, 45);
DateTimeFormatter fmt =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String text = now.format(fmt);
System.out.println(text); // 2025-03-26 09:30:45
}
}
Javaここで大事なのは
「日時オブジェクトが主役で、フォーマッタは“見せ方のルール”」
という感覚です。
日付だけを文字列にする:LocalDate → String
典型的な業務フォーマット(yyyy/MM/dd)
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class LocalDateToStringExample {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 3, 26);
DateTimeFormatter fmt =
DateTimeFormatter.ofPattern("yyyy/MM/dd");
String text = date.format(fmt);
System.out.println(text); // 2025/03/26
}
}
Javaここでのポイントは二つです。
一つ目は、「LocalDate は“日付だけ”なので、時刻は出てこない」こと。
請求日、締切日、誕生日など、“日付だけ”を扱う場面にぴったりです。
二つ目は、「フォーマットを一か所にまとめておくと再利用しやすい」こと。
例えば DateTimeFormatter DATE_JP = DateTimeFormatter.ofPattern("yyyy/MM/dd"); のように
共通クラスに定義しておくと、画面・CSV・ログで同じ見た目を簡単に再利用できます。
時刻だけを文字列にする:LocalTime → String
「HH:mm」形式での出力
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class LocalTimeToStringExample {
public static void main(String[] args) {
LocalTime time = LocalTime.of(9, 30);
DateTimeFormatter fmt =
DateTimeFormatter.ofPattern("HH:mm");
String text = time.format(fmt);
System.out.println(text); // 09:30
}
}
Java「営業開始時刻」「締切時刻」「バッチ開始時刻」など、
“時間帯だけ”を表示したいときに使います。
秒まで出したいなら "HH:mm:ss"、
ミリ秒まで出したいなら "HH:mm:ss.SSS" のようにパターンを変えます。
日付+時刻を文字列にする:LocalDateTime → String
「yyyy-MM-dd HH:mm:ss」形式での出力
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class LocalDateTimeToStringExample {
public static void main(String[] args) {
LocalDateTime dt = LocalDateTime.of(2025, 3, 26, 9, 30, 45);
DateTimeFormatter fmt =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String text = dt.format(fmt);
System.out.println(text); // 2025-03-26 09:30:45
}
}
Javaここで深掘りしたいのは、
「LocalDateTime はタイムゾーンを持たない“ローカルな日時”」という点です。
サーバーのローカル時間で「登録日時」「更新日時」を管理しているようなシステムでは、
この形で文字列化することが多いです。
タイムゾーン付き日時を文字列にする:ZonedDateTime / Instant
ZonedDateTime → ISO 形式文字列
ZonedDateTime は toString() だけでもかなり情報量の多い文字列になります。
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class ZonedDateTimeToStringExample {
public static void main(String[] args) {
ZonedDateTime zdt = ZonedDateTime.of(
2025, 3, 26,
9, 30, 45, 0,
ZoneId.of("Asia/Tokyo")
);
System.out.println(zdt.toString());
// 2025-03-26T09:30:45+09:00[Asia/Tokyo]
}
}
Javaこの形式には
日付+時刻
UTC からのオフセット(+09:00)
タイムゾーンID([Asia/Tokyo])
が含まれていて、“世界のどの瞬間か”を完全に表現できます。
システム間連携や監査ログなど、
「後からタイムゾーンまで含めて正確に復元したい」場面に向いています。
Instant → ISO 形式文字列
Instant も toString() で ISO 形式になります。
import java.time.Instant;
public class InstantToStringExample {
public static void main(String[] args) {
Instant instant = Instant.now();
System.out.println(instant); // 例: 2025-03-26T00:30:45.123Z
}
}
Java末尾の Z は「UTC」を意味します。
「世界共通のタイムスタンプ」としてログや DB に保存するのに向いています。
ロケールや日本語表記を使いたい場合
「yyyy年MM月dd日」のような日本語フォーマット
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class JapaneseFormatExample {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 3, 26);
DateTimeFormatter fmt =
DateTimeFormatter.ofPattern("yyyy年MM月dd日", Locale.JAPAN);
String text = date.format(fmt);
System.out.println(text); // 2025年03月26日
}
}
JavaLocale を指定しておくと、
曜日名や月名を文字で出したいときにも効いてきます。
例えば "EEEE" を使うと曜日名になります(ロケールに応じた言語で出力されます)。
実務での設計のコツ
フォーマットを「散らさない」
あちこちで DateTimeFormatter.ofPattern("yyyy/MM/dd") のように
バラバラに書き始めると、
「画面 A と画面 B で微妙にフォーマットが違う」
「仕様変更で全部探し回る」
という地獄が待っています。
共通のユーティリティクラスや定数クラスに
public static final DateTimeFormatter DATE_JP
= DateTimeFormatter.ofPattern("yyyy/MM/dd");
public static final DateTimeFormatter DATETIME_JP
= DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
Javaのようにまとめておき、
「日時→文字列」は必ずそこ経由で行う、というルールにすると、
仕様変更にも強く、レビューもしやすくなります。
まとめ:日時→文字列で身につけてほしい感覚
日時→文字列は、
単に「表示用に変える」だけでなく、
「どこで、どんなルールで見せるか」を設計する行為です。
DateTimeFormatter でフォーマットを決める。LocalDate / LocalTime / LocalDateTime / ZonedDateTime / Instant それぞれに合った形で format する。
フォーマットは共通化して、システム全体で一貫性を持たせる。
あなたのコードのどこかに、date.toString() をそのまま画面やログに出している箇所があれば、
そこを一度「明示的なフォーマット」に置き換えられないか眺めてみてください。
それだけで、
「人にも機械にも優しい日時の扱い方」に、一歩近づけます。
