Java Tips | 日付・時間:文字列→日時

Java Java
スポンサーリンク

文字列→日時変換の全体イメージ

String で受け取った日付・時刻」を、そのまま文字列のまま扱うと、
比較・加算・バリデーションがすべて自前実装になってしまいます。

そこでやるべきことはシンプルで、

「文字列 → 日時オブジェクト(LocalDate など) → 必要なら別形式の文字列」

という流れに乗せることです。
この“真ん中”を担うのが java.timeDateTimeFormatter です。


文字列→日時の基本:DateTimeFormatter と parse

DateTimeFormatter の役割

DateTimeFormatter は「このパターンで日付文字列を読む/書く」という“型紙”です。

例えば "yyyy/MM/dd" なら「2025/03/26」、
"yyyy-MM-dd HH:mm:ss" なら「2025-03-26 09:30:00」を扱えます。

LocalDate.parseLocalDateTime.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 への変換」を導入してみてください。

そこから先は、かなり気持ちよくリファクタリングが進むはずです。

タイトルとURLをコピーしました