Java : 文字列と日付・時刻の変換

日付・時刻を表す文字列としては、例えば

  • "2021年05月10日"
  • "23時59分30秒"
  • "2021-05-10T07:30:10"

といったものがあります。
そんな文字列から、Javaの日付・時刻クラスである LocalDate、LocalTime、LocalDateTime への変換方法をご紹介します。


用語の定義

本記事では、時間に関する用語を以下のように定義します。

用語 定義
日付 年と月と日 2021/5/4、2000年12月31日
時刻 時と分と秒 12:30:59、7時30分45秒
日時 日付と時刻 2021/5/4 12:30:59、2000年12月31日 7時30分45秒

簡単なまとめ

変換 表記 使用例
日付 → 文字列 ISO 8601
var date = LocalDate.of(2021, 5, 1);
var str = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(str); // "2021-05-01"
yyyy年MM月dd日
var date = LocalDate.of(2021, 5, 1);
var str = date.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
System.out.println(str); // "2021年05月01日"
文字列 → 日付 ISO 8601
var date = LocalDate.parse("2021-05-01");
System.out.println(date); // 2021-05-01
yyyy年MM月dd日
var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
var date = LocalDate.parse("2021年05月01日", formatter);
System.out.println(date); // 2021-05-01
時刻 → 文字列 ISO 8601
var time = LocalTime.of(7, 30, 10);
var str = time.format(DateTimeFormatter.ISO_LOCAL_TIME);
System.out.println(str); // "07:30:10"
HH時mm分ss秒
var time = LocalTime.of(7, 30, 10);
var str = time.format(DateTimeFormatter.ofPattern("HH時mm分ss秒"));
System.out.println(str); // "07時30分10秒"
文字列 → 時刻 ISO 8601
var time = LocalTime.parse("07:30:10");
System.out.println(time); // 07:30:10
HH時mm分ss秒
var formatter = DateTimeFormatter.ofPattern("HH時mm分ss秒");
var time = LocalTime.parse("07時30分10秒", formatter);
System.out.println(time); // 07:30:10
日時 → 文字列 ISO 8601
var dateTime = LocalDateTime.of(2021, 5, 10, 7, 30, 10);
var str = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println(str); // "2021-05-10T07:30:10"
yyyy年MM月dd日 HH時mm分ss秒
var dateTime = LocalDateTime.of(2021, 5, 10, 7, 30, 10);
var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒");
var str = dateTime.format(formatter);
System.out.println(str); // "2021年05月10日 07時30分10秒"
文字列 → 日時 ISO 8601
var dateTime = LocalDateTime.parse("2021-05-10T07:30:10");
System.out.println(dateTime); // 2021-05-10T07:30:10
yyyy年MM月dd日 HH時mm分ss秒
var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒");
var dateTime = LocalDateTime.parse("2021年05月10日 07時30分10秒", formatter);
System.out.println(dateTime); // 2021-05-10T07:30:10

文字列表記

日付・時刻を文字列に変換するためには、まず日付・時刻をどのような表記にするのか、というのを決めなければなりません。
例えば、日本語では "2021年5月10日 14時30分59秒" と表記できます。
"2021/5/10 14:30" という表記なんかもよく見ますね。

ISO 8601

ISO 8601は、日付と時刻の表記に関するISOの国際規格である。

日付・時刻の文字列表記として、国際規格のISO 8601というものがあります。
Javaに限らずいろいろなプログラミング言語でお目にかかるので、理解しておいて損はないでしょう。

形式 表記例 (2021年4月28日 16時47分23秒)
基本形式 20210428T164723
拡張形式 2021-04-28T16:47:23

2つの形式がありますが、Javaでは拡張形式がよく使われています。
DateTimeFormatterに用意されている定数にも拡張形式が多めです。

final var dateTime = LocalDateTime.of(2021, 4, 28, 16, 47, 23);

final var str1 = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println(str1); // 2021-04-28T16:47:23

final var str2 = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(str2); // 2021-04-28

final var str3 = dateTime.format(DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(str3); // 20210428

final var str4 = dateTime.format(DateTimeFormatter.ISO_LOCAL_TIME);
System.out.println(str4); // 16:47:23
// タイムゾーンあり
final var dateTime = ZonedDateTime.of(
        2021, 4, 28, 16, 47, 23, 0,
        ZoneId.systemDefault());

final var str = dateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
System.out.println(str); // 2021-04-28T16:47:23+09:00[Asia/Tokyo]

ちょっと見慣れないのが、日付と時刻を区切る文字として T を使っているところでしょうか。

ユーザに見せる表記としては向いていませんが、プログラム内で管理するにはISO 8601を使うと便利なことも多いです。
(例えば、ユーザには見せないテキストファイルに日時を保存したい場合など)

日本向けの表記

ロケールが日本の場合は、以下のような表記(フォーマッター)が用意されています。

final var dateTime = ZonedDateTime.of(
        2021, 4, 28, 16, 47, 23, 0,
        ZoneId.systemDefault());

final var formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL);
System.out.println(dateTime.format(formatter1)); // 2021年4月28日水曜日 16時47分23秒 日本標準時

final var formatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
System.out.println(dateTime.format(formatter2)); // 2021年4月28日 16:47:23 JST

final var formatter3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
System.out.println(dateTime.format(formatter3)); // 2021/04/28 16:47:23

final var formatter4 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
System.out.println(dateTime.format(formatter4)); // 2021/04/28 16:47

独自の表記

書式設定および解析用のパターン

独自の表記にしたい場合は書式設定を使います。
よく使う書式を一部抜粋します。

記号 説明
yyyy 年(4桁で表示) 2021
MM 月(01~12) 12
dd 日(01~31) 10
HH 時(00~23) 07
mm 分(00~59) 30
ss 秒(00~59) 15

詳細については、リンク先の DateTimeFormatter API仕様をご確認ください。

final var dateTime = LocalDateTime.of(2021, 1, 2, 3, 4, 5);

final var formatter1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
System.out.println(dateTime.format(formatter1)); // 2021/01/02 03:04:05

final var formatter2 = DateTimeFormatter.ofPattern("y/M/d H:m:s");
System.out.println(dateTime.format(formatter2)); // 2021/1/2 3:4:5
final var dateTime = LocalDateTime.of(2021, 5, 1, 15, 0, 0);

final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日(E) a hh:mm");
System.out.println(dateTime.format(formatter)); // 2021年05月01日(土) 午後 03:00

変換

日付 → 文字列

public String format​(DateTimeFormatter formatter)
指定されたフォーマッタを使用してこの日付を書式設定します。

日付から文字列への変換は、LocalDate.format ​メソッドと DateTimeFormatter を使います。

定義済みのフォーマッタを使う例です。

final var date = LocalDate.of(2021, 5, 10);

System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE)); // 2021-05-10
System.out.println(date.format(DateTimeFormatter.BASIC_ISO_DATE)); // 20210510

独自のフォーマッタを使う例です。

final var date = LocalDate.of(2021, 5, 1);

final var formatter1 = DateTimeFormatter.ofPattern("yyyy/MM/dd");
System.out.println(date.format(formatter1)); // 2021/05/01

final var formatter2 = DateTimeFormatter.ofPattern("y/M/d");
System.out.println(date.format(formatter2)); // 2021/5/1

final var formatter3 = DateTimeFormatter.ofPattern("yyyy年MM月dd日(E)");
System.out.println(date.format(formatter3)); // 2021年05月01日(土)

文字列 → 日付

public static LocalDate parse​(CharSequence text, DateTimeFormatter formatter)
特定のフォーマッタを使用して、テキスト文字列からLocalDateのインスタンスを取得します。

文字列から LocalDate へ変換するには、LocalDate.parse メソッドと DateTimeFormatter を使います。

定義済みのフォーマッタを使う例です。

final var date1 = LocalDate.parse("2021-05-10", DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(date1); // 2021-05-10

// ISO_LOCAL_DATEの場合はフォーマッタを省略できます。
final var date2 = LocalDate.parse("2021-05-10");
System.out.println(date2); // 2021-05-10

final var date3 = LocalDate.parse("20210510", DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(date3); // 2021-05-10

// 0の省略はできません。(例外が発生します)
//LocalDate.parse("2021-5-1"); // DateTimeParseException

独自のフォーマッタを使う例です。

final var formatter = DateTimeFormatter.ofPattern("y/M/d");

final var date1 = LocalDate.parse("2021/05/01", formatter);
System.out.println(date1); // 2021-05-01

// 0を省略した表記も許容されます。
final var date2 = LocalDate.parse("2021/5/1", formatter);
System.out.println(date2); // 2021-05-01
final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
final var date = LocalDate.parse("2021年05月01日", formatter);
System.out.println(date); // 2021-05-01

時刻 → 文字列

public String format​(DateTimeFormatter formatter)
指定されたフォーマッタを使用してこの時間を書式設定します。

時刻から文字列への変換は、LocalTime.format ​メソッドと DateTimeFormatter を使います。

定義済みのフォーマッタを使う例です。

final var time = LocalTime.of(7, 30, 10);
System.out.println(time.format(DateTimeFormatter.ISO_LOCAL_TIME)); // 07:30:10

独自のフォーマッタを使う例です。

final var time = LocalTime.of(1, 2, 3);

final var formatter1 = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println(time.format(formatter1)); // 01:02:03

final var formatter2 = DateTimeFormatter.ofPattern("H:m:s");
System.out.println(time.format(formatter2)); // 1:2:3
final var time = LocalTime.of(7, 30, 10);

final var formatter = DateTimeFormatter.ofPattern("HH時mm分ss秒");
System.out.println(time.format(formatter)); // 07時30分10秒
final var formatter = DateTimeFormatter.ofPattern("a hh:mm");

final var time1 = LocalTime.of(10, 15);
System.out.println(time1.format(formatter)); // 午前 10:15

final var time2 = LocalTime.of(17, 30);
System.out.println(time2.format(formatter)); // 午後 05:30

文字列 → 時刻

public static LocalTime parse​(CharSequence text, DateTimeFormatter formatter)
特定のフォーマッタを使用して、テキスト文字列からLocalTimeのインスタンスを取得します。

文字列から LocalTime へ変換するには、LocalTime.parse メソッドと DateTimeFormatter を使います。

定義済みのフォーマッタを使う例です。

final var time1 = LocalTime.parse("07:30:10", DateTimeFormatter.ISO_LOCAL_TIME);
System.out.println(time1); // 07:30:10

// ISO_LOCAL_TIMEの場合はフォーマッタを省略できます。
final var time2 = LocalTime.parse("07:30:10");
System.out.println(time2); // 07:30:10

// 0の省略はできません。(例外が発生します)
//LocalTime.parse("1:2:3"); // DateTimeParseException

独自のフォーマッタを使う例です。

final var formatter = DateTimeFormatter.ofPattern("H:m:s");

final var time1 = LocalTime.parse("01:02:03", formatter);
System.out.println(time1); // 01:02:03

// 0を省略した表記も許容されます。
final var time2 = LocalTime.parse("1:2:3", formatter);
System.out.println(time2); // 01:02:03
final var formatter = DateTimeFormatter.ofPattern("HH時mm分ss秒");
final var time = LocalTime.parse("07時30分10秒", formatter);
System.out.println(time); // 07:30:10
final var formatter = DateTimeFormatter.ofPattern("a hh:mm");

final var time1 = LocalTime.parse("午前 10:15", formatter);
System.out.println(time1); // 10:15

final var time2 = LocalTime.parse("午後 05:30", formatter);
System.out.println(time2); // 17:30

日時 → 文字列

public String format​(DateTimeFormatter formatter)
指定されたフォーマッタを使用してこの日付/時間を書式設定します。

日時から文字列への変換は、LocalDateTime.format メソッドと DateTimeFormatter を使います。

定義済みのフォーマッタを使う例です。

final var dateTime = LocalDateTime.of(2021, 5, 10, 7, 30, 10);
final var str = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println(str); // 2021-05-10T07:30:10

ローカライズされたフォーマッタを使う例です。

final var dateTime = LocalDateTime.of(2021, 5, 10, 7, 30, 10);

final var formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
System.out.println(dateTime.format(formatter1)); // 2021/05/10 7:30:10

final var formatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
System.out.println(dateTime.format(formatter2)); // 2021/05/10 7:30

// FULLとLONGはタイムゾーンがないと例外が発生します。

final var formatter3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL);
//dateTime.format(formatter3); // DateTimeException

final var formatter4 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
//dateTime.format(formatter4); // DateTimeException

独自のフォーマッタを使う例です。

final var dateTime = LocalDateTime.of(2021, 5, 1, 2, 3, 4);

final var formatter1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
System.out.println(dateTime.format(formatter1)); // 2021/05/01 02:03:04

final var formatter2 = DateTimeFormatter.ofPattern("y/M/d H:m:s");
System.out.println(dateTime.format(formatter2)); // 2021/5/1 2:3:4
final var dateTime = LocalDateTime.of(2021, 5, 1, 10, 15, 30);

final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒");
System.out.println(dateTime.format(formatter)); // 2021年05月01日 10時15分30秒

文字列 → 日時

public static LocalDateTime parse​(CharSequence text, DateTimeFormatter formatter)
特定のフォーマッタを使用して、テキスト文字列からLocalDateTimeのインスタンスを取得します。

文字列から LocalDateTime へ変換するには、LocalDateTime.parse メソッドと DateTimeFormatter を使います。

定義済みのフォーマッタを使う例です。

final var dateTime1 = LocalDateTime.parse(
        "2021-05-10T07:30:10", DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println(dateTime1); // 2021-05-10T07:30:10

// ISO_LOCAL_DATE_TIMEの場合はフォーマッタを省略できます。
final var dateTime2 = LocalDateTime.parse("2021-05-10T07:30:10");
System.out.println(dateTime2); // 2021-05-10T07:30:10

// 0の省略はできません。(例外が発生します)
//LocalDateTime.parse("2021-5-1T1:2:3"); // DateTimeParseException

ローカライズされたフォーマッタを使う例です。

final var formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
final var dateTime1 = LocalDateTime.parse("2021/05/10 7:30:10", formatter1);
System.out.println(dateTime1); // 2021-05-10T07:30:10

final var formatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
final var dateTime2 = LocalDateTime.parse("2021/05/10 7:30", formatter2);
System.out.println(dateTime2); // 2021-05-10T07:30

独自のフォーマッタを使う例です。

final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒");
final var dateTime = LocalDateTime.parse("2021年05月10日 05時30分45秒", formatter);
System.out.println(dateTime); // 2021-05-10T05:30:45
final var formatter = DateTimeFormatter.ofPattern("y/M/d H:m:s");

final var dateTime1 = LocalDateTime.parse("2021/05/01 02:03:04", formatter);
System.out.println(dateTime1); // 2021-05-01T02:03:04

// 0を省略した表記も許容されます。
final var dateTime2 = LocalDateTime.parse("2021/5/1 2:3:4", formatter);
System.out.println(dateTime2); // 2021-05-01T02:03:04

日時(タイムゾーンあり) → 文字列

public String format​(DateTimeFormatter formatter)
指定されたフォーマッタを使用してこの日付/時間を書式設定します。

日時(タイムゾーンあり)から文字列への変換は、ZonedDateTime.format メソッドと DateTimeFormatter を使います。

定義済みのフォーマッタを使う例です。

final var formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

final var dateTime1 = ZonedDateTime.of(
        2021, 5, 10, 7, 30, 10, 0, ZoneId.systemDefault());
final var str1 = dateTime1.format(formatter);
System.out.println(str1); // 2021-05-10T07:30:10+09:00[Asia/Tokyo]

final var dateTime2 = ZonedDateTime.of(
        2021, 5, 10, 7, 30, 10, 0, ZoneOffset.UTC);
final var str2 = dateTime2.format(formatter);
System.out.println(str2); // 2021-05-10T07:30:10Z

final var dateTime3 = ZonedDateTime.of(
        2021, 5, 10, 7, 30, 10, 123000000, ZoneOffset.ofHoursMinutes(-4, -30));
final var str3 = dateTime3.format(formatter);
System.out.println(str3); // 2021-05-10T07:30:10.123-04:30

ローカライズされたフォーマッタを使う例です。

final var dateTime = ZonedDateTime.of(
        2021, 5, 10, 7, 30, 10, 0, ZoneId.systemDefault());

final var formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL);
final var str1 = dateTime.format(formatter1);
System.out.println(str1); // 2021年5月10日月曜日 7時30分10秒 日本標準時

final var formatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
final var str2 = dateTime.format(formatter2);
System.out.println(str2); // 2021年5月10日 7:30:10 JST

final var formatter3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
final var str3 = dateTime.format(formatter3);
System.out.println(str3); // 2021/05/10 7:30:10

final var formatter4 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
final var str4 = dateTime.format(formatter4);
System.out.println(str4); // 2021/05/10 7:30

独自のフォーマッタを使う例です。

final var dateTime = ZonedDateTime.of(
        2021, 5, 1, 10, 15, 30, 0, ZoneId.systemDefault());

final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒 z");
final var str = dateTime.format(formatter);
System.out.println(str); // 2021年05月01日 10時15分30秒 JST
final var dateTime = ZonedDateTime.of(
        2021, 5, 1, 2, 3, 4, 0, ZoneId.systemDefault());

final var formatter1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss VV");
final var str1 = dateTime.format(formatter1);
System.out.println(str1); // 2021/05/01 02:03:04 Asia/Tokyo

final var formatter2 = DateTimeFormatter.ofPattern("y/M/d H:m:s VV");
final var str2 = dateTime.format(formatter2);
System.out.println(str2); // 2021/5/1 2:3:4 Asia/Tokyo

文字列 → 日時(タイムゾーンあり)

public static ZonedDateTime parse​(CharSequence text, DateTimeFormatter formatter)
特定のフォーマッタを使用して、テキスト文字列からZonedDateTimeのインスタンスを取得します。

文字列から ZonedDateTime へ変換するには、ZonedDateTime.parse メソッドと DateTimeFormatter を使います。

定義済みのフォーマッタを使う例です。

final var dateTime1 = ZonedDateTime.parse(
        "2021-05-10T07:30:10+09:00[Asia/Tokyo]", DateTimeFormatter.ISO_ZONED_DATE_TIME);
System.out.println(dateTime1); // 2021-05-10T07:30:10+09:00[Asia/Tokyo]

// ISO_ZONED_DATE_TIMEの場合はフォーマッタを省略できます。
final var dateTime2 = ZonedDateTime.parse("2021-05-10T07:30:10+09:00[Asia/Tokyo]");
System.out.println(dateTime2); // 2021-05-10T07:30:10+09:00[Asia/Tokyo]

final var dateTime3 = ZonedDateTime.parse("2021-05-10T07:30:10Z");
System.out.println(dateTime3); // 2021-05-10T07:30:10Z

// 0の省略はできません。(例外が発生します)
//ZonedDateTime.parse("2021-5-1T2:3:4Z"); // DateTimeParseException

ローカライズされたフォーマッタを使う例です。

final var formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL);
final var dateTime1 = ZonedDateTime.parse("2021年5月10日月曜日 7時30分10秒 日本標準時", formatter1);
System.out.println(dateTime1); // 2021-05-10T07:30:10+09:00[Asia/Tokyo]

final var formatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
final var dateTime2 = ZonedDateTime.parse("2021年5月10日 7:30:10 JST", formatter2);
System.out.println(dateTime2); // 2021-05-10T07:30:10+09:00[Asia/Tokyo]

// MEDIUMとSHORTは例外が発生します。

final var formatter3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
//ZonedDateTime.parse("2021/05/10 7:30:10", formatter3); // DateTimeParseException

final var formatter4 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
//ZonedDateTime.parse("2021/05/10 7:30", formatter4); // DateTimeParseException

独自のフォーマッタを使う例です。

final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒 z");
final var dateTime = ZonedDateTime.parse("2021年05月01日 10時15分30秒 JST", formatter);
System.out.println(dateTime); // 2021-05-01T10:15:30+09:00[Asia/Tokyo]
final var formatter = DateTimeFormatter.ofPattern("y/M/d H:m:s VV");

final var dateTime1 = ZonedDateTime.parse("2021/05/01 02:03:04 Asia/Tokyo", formatter);
System.out.println(dateTime1); // 2021-05-01T02:03:04+09:00[Asia/Tokyo]

// 0を省略した表記も許容されます。
final var dateTime2 = ZonedDateTime.parse("2021/5/1 2:3:4 Asia/Tokyo", formatter);
System.out.println(dateTime2); // 2021-05-01T02:03:04+09:00[Asia/Tokyo]

失敗例

文字列の表記とフォーマッタが一致しない場合は、非チェック例外の DateTimeException (もしくはそのサブクラス) が発生します。

// ISO形式では0の省略は許容されていません。
//LocalDate.parse("2021/5/1", DateTimeFormatter.ISO_LOCAL_DATE); // DateTimeParseException

// フォーマッタの形式が違う場合(日付データに時刻フォーマッタを指定)
final var date = LocalDate.of(2021, 5, 10);
//date.format(DateTimeFormatter.ISO_TIME); // UnsupportedTemporalTypeException

関連記事

ページの先頭へ