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

Java Java
スポンサーリンク

「日時→文字列」は“見せ方を決める”作業

日時オブジェクト(LocalDateLocalDateTime など)は、
そのままだと「内部的に意味のある値」ですが、人間には少し分かりにくいことがあります。

画面表示、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 形式文字列

ZonedDateTimetoString() だけでもかなり情報量の多い文字列になります。

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 形式文字列

InstanttoString() で 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日
    }
}
Java

Locale を指定しておくと、
曜日名や月名を文字で出したいときにも効いてきます。

例えば "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() をそのまま画面やログに出している箇所があれば、
そこを一度「明示的なフォーマット」に置き換えられないか眺めてみてください。

それだけで、
「人にも機械にも優しい日時の扱い方」に、一歩近づけます。

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