文字列→日時変換の全体イメージ
「String で受け取った日付・時刻」を、そのまま文字列のまま扱うと、
比較・加算・バリデーションがすべて自前実装になってしまいます。
そこでやるべきことはシンプルで、
「文字列 → 日時オブジェクト(LocalDate など) → 必要なら別形式の文字列」
という流れに乗せることです。
この“真ん中”を担うのが java.time と DateTimeFormatter です。
文字列→日時の基本:DateTimeFormatter と parse
DateTimeFormatter の役割
DateTimeFormatter は「このパターンで日付文字列を読む/書く」という“型紙”です。
例えば "yyyy/MM/dd" なら「2025/03/26」、"yyyy-MM-dd HH:mm:ss" なら「2025-03-26 09:30:00」を扱えます。
LocalDate.parse や LocalDateTime.parse に、このフォーマッタを渡すことで、
文字列から日時オブジェクトを生成できます。
最小パターンの例
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class StringToLocalDateBasic {
public static void main(String[] args) {
String text = "2025-03-26";
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse(text, fmt);
System.out.println(date); // 2025-03-26
}
}
Javaここで押さえてほしいのは、
「文字列の見た目」と「パターン文字」が 1 対 1 で対応している、
という感覚です。
日付だけ:文字列 → LocalDate
典型的な業務フォーマット(yyyy/MM/dd)
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class StringToLocalDateExample {
public static void main(String[] args) {
String text = "2025/03/26";
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate date = LocalDate.parse(text, fmt);
System.out.println(date); // 2025-03-26
}
}
Javaポイントは二つです。
一つ目は、「LocalDate は“日付だけ”」ということ。
DB の「生年月日」「締切日」「営業日」など、“時間はいらない”ものに向いています。
二つ目は、「内部表現は ISO 形式(2025-03-26)になる」こと。
入力が 2025/03/26 でも、toString() すると 2025-03-26 になります。
時刻だけ:文字列 → LocalTime
「HH:mm」形式の時刻文字列
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class StringToLocalTimeExample {
public static void main(String[] args) {
String text = "09:30";
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("HH:mm");
LocalTime time = LocalTime.parse(text, fmt);
System.out.println(time); // 09:30
}
}
Java「営業開始時刻」「締切時刻」「バッチ開始時刻」など、
“何日の何時か”ではなく“何時か”だけを扱いたいときに使います。
日付+時刻:文字列 → LocalDateTime
「yyyy-MM-dd HH:mm:ss」形式を LocalDateTime に
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class StringToLocalDateTimeExample {
public static void main(String[] args) {
String text = "2025-03-26 09:30:45";
DateTimeFormatter fmt =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(text, fmt);
System.out.println(dateTime); // 2025-03-26T09:30:45
}
}
Javaここで重要なのは、
「LocalDateTime はタイムゾーンを持たない“ローカルな日時”」
という点です。
ログや DB の「登録日時」「更新日時」など、
“サーバーのローカル時間で管理する”ケースでよく使われます。
タイムゾーン付き:文字列 → ZonedDateTime
ISO 形式(オフセット+ゾーン付き)の例
import java.time.ZonedDateTime;
public class StringToZonedDateTimeExample {
public static void main(String[] args) {
String text = "2025-03-26T09:30:45+09:00[Asia/Tokyo]";
ZonedDateTime zdt = ZonedDateTime.parse(text);
System.out.println(zdt);
// 2025-03-26T09:30:45+09:00[Asia/Tokyo]
}
}
Javaこの形式には、
日付+時刻
UTC からのオフセット(+09:00)
タイムゾーンID([Asia/Tokyo])
がすべて入っています。
“世界のどの瞬間か”を完全に復元できるので、
システム間連携やログ保存に向いています。
エラー処理:parse 失敗時の扱い
DateTimeParseException を必ず意識する
フォーマットと合わない文字列を渡すと、DateTimeParseException が投げられます。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
public class ParseErrorExample {
public static void main(String[] args) {
String text = "not-a-date";
DateTimeFormatter fmt =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
try {
LocalDateTime dt = LocalDateTime.parse(text, fmt);
System.out.println(dt);
} catch (DateTimeParseException e) {
System.out.println("解析エラー: " + e.getMessage());
}
}
}
Java業務システムでは、
入力チェック(バリデーション)
CSV 取り込み時のエラーログ
API リクエストのフォーマットエラー
などで、この例外をきちんと扱うことがとても重要です。
実務での設計のコツ
「どのクラスで受けるか」を最初に決める
同じ「文字列→日時」でも、用途によって使うクラスを変えると設計がきれいになります。
日付だけなら LocalDate
時刻だけなら LocalTime
日付+時刻(ローカル)なら LocalDateTime
タイムゾーンまで含めたいなら ZonedDateTime
システム間で“瞬間”を共有したいなら Instant
そして、
「外からは文字列で来るが、内部では java.time で扱う」
「出力時だけ文字列に戻す」
という流れを徹底すると、ロジックがかなりシンプルになります。
あなたのプロジェクトの中で、
日時をずっと String のまま持っていたり、Date と混在していたりする箇所があれば、
まずは一か所だけでも「文字列→java.time への変換」を導入してみてください。
そこから先は、かなり気持ちよくリファクタリングが進むはずです。
