広告

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

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

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

といったものがあります。

このような文字列から、Java の日付・時刻クラスである LocalDate、LocalTime、LocalDateTime への変換方法をご紹介します。


用語の定義

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

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

簡単なまとめ

文字列と日付・時刻を変換するコード例の簡単なまとめです。
もう少し詳しく知りたいかたは、後述する「変換」をご参照ください。

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

文字列表記

日付・時刻を文字列に変換するためには、まず日付・時刻をどのような 表記 にするのか、というのを決めなければなりません。

例えば、日本語では日時を

  • 2100年5月10日 14時30分59秒

と表記できます。

  • 2100/5/10 14:30

という表記なんかもよく見ますね。

ISO 8601

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

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

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

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

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

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

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

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

final var str4 = dateTime.format(DateTimeFormatter.ISO_LOCAL_TIME);
System.out.println(str4); // 16:47:23

// LocalDateTime.toString も ISO 8601 形式
final var str5 = dateTime.toString();
System.out.println(str5); // 2099-04-28T16:47:23
// タイムゾーンあり
final var dateTime = ZonedDateTime.of(
        2099, 4, 28, 16, 47, 23, 0, ZoneId.systemDefault());

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

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

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

日本向けの表記

ロケールが日本の場合は、次のような 表記(フォーマッター) が用意されています。
フォーマッターの取得には DateTimeFormatter.ofLocalizedDateTime を使います。

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

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

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

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

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

独自の表記

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

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

記号 説明
yyyy 年(4桁で表示) 2099
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(2099, 1, 2, 3, 4, 5);

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

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

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

変換

日付 → 文字列

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

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

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

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

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

// LocalDate.toString も ISO 8601 形式
final var str = date.toString();
System.out.println(str); // 2099-05-10

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

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

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

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

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

文字列 → 日付

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

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

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

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

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

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

// 月と日の 0 は省略できません。(例外が発生します)
try {
    final var date4 = LocalDate.parse("2099-5-1");
} catch (DateTimeParseException e) {
    System.out.println("DateTimeParseException! : " + e.getMessage());
}

// 結果
// ↓
//DateTimeParseException! : Text '2099-5-1' could not be parsed at index 5

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

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

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

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

// LocalTime.toString も ISO 8601 形式
final var str = time.toString();
System.out.println(str); // 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 の省略はできません。(例外が発生します)
try {
    final var time3 = LocalTime.parse("1:2:3");
} catch (DateTimeParseException e) {
    System.out.println("DateTimeParseException! : " + e.getMessage());
}

// 結果
// ↓
//DateTimeParseException! : Text '1:2:3' could not be parsed at index 0

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

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(2099, 5, 10, 7, 30, 10);
final var str1 = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println(str1); // 2099-05-10T07:30:10

// LocalDateTime.toString も ISO 8601 形式
final var str2 = dateTime.toString();
System.out.println(str2); // 2099-05-10T07:30:10

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

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

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

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

// FULL と LONG はタイムゾーンがないと例外が発生します。
try {
    final var formatter3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL);
    final var str = dateTime.format(formatter3);
} catch (DateTimeException e) {
    System.out.println("DateTimeException! : " + e.getMessage());
}

// 結果
// ↓
//DateTimeException! : Unable to extract ZoneId from temporal 2099-05-10T07:30:10

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

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

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

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

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

文字列 → 日時

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

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

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

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

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

// 月・日や時刻は 0 の省略ができません。(例外が発生します)
try {
    final var dateTime3 = LocalDateTime.parse("2099-5-1T1:2:3");
} catch (DateTimeParseException e) {
    System.out.println("DateTimeParseException! : " + e.getMessage());
}

// 結果
// ↓
//DateTimeParseException! : Text '2099-5-1T1:2:3' could not be parsed at index 5

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

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

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

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

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

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

// 0 を省略した表記も許容されます。
final var dateTime2 = LocalDateTime.parse("2099/5/1 2:3:4", formatter);
System.out.println(dateTime2); // 2099-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(
        2099, 5, 10, 7, 30, 10, 0, ZoneId.systemDefault());
final var str1 = dateTime1.format(formatter);
System.out.println(str1); // 2099-05-10T07:30:10+09:00[Asia/Tokyo]

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

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

// ZonedDateTime.toString も ISO 8601 形式
final var str = dateTime.toString();
System.out.println(str); // 2099-05-10T07:30:10+09:00[Asia/Tokyo]

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

final var dateTime = ZonedDateTime.of(
        2100, 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); // 2100年5月10日月曜日 7時30分10秒 日本標準時

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

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

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

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

final var dateTime = ZonedDateTime.of(
        2100, 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); // 2100年05月01日 10時15分30秒 JST
final var dateTime = ZonedDateTime.of(
        2100, 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); // 2100/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); // 2100/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(
        "2099-05-10T07:30:10+09:00[Asia/Tokyo]", DateTimeFormatter.ISO_ZONED_DATE_TIME);
System.out.println(dateTime1); // 2099-05-10T07:30:10+09:00[Asia/Tokyo]

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

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

// 月・日や時刻は 0 の省略ができません。(例外が発生します)
try {
    final var dateTime4 = ZonedDateTime.parse("2099-5-1T2:3:4Z");
} catch (DateTimeParseException e) {
    System.out.println("DateTimeParseException! : " + e.getMessage());
}

// 結果
// ↓
//DateTimeParseException! : Text '2099-5-1T2:3:4Z' could not be parsed at index 5

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

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

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

// MEDIUM と SHORT は例外が発生します。
try {
    final var formatter3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    final var str = ZonedDateTime.parse("2100/05/10 07:30:10", formatter3);
} catch (DateTimeParseException e) {
    System.out.println("DateTimeParseException! : " + e.getMessage());
}

// 結果
// ↓
//DateTimeParseException! : Text '2100/05/10 07:30:10' could not be parsed:
// Unable to obtain ZonedDateTime from TemporalAccessor: {},
// ISO resolved to 2100-05-10T07:30:10 of type java.time.format.Parsed

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

final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒 z");
final var dateTime = ZonedDateTime.parse("2100年05月01日 10時15分30秒 JST", formatter);
System.out.println(dateTime); // 2100-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("2100/05/01 02:03:04 Asia/Tokyo", formatter);
System.out.println(dateTime1); // 2100-05-01T02:03:04+09:00[Asia/Tokyo]

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

失敗例

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

// ISO形式では 0 の省略は許容されていません。
try {
    final var date = LocalDate.parse("2100/5/1", DateTimeFormatter.ISO_LOCAL_DATE);
} catch (DateTimeParseException e) {
    System.out.println("DateTimeParseException! : " + e.getMessage());
}

// 結果
// ↓
//DateTimeParseException! : Text '2100/5/1' could not be parsed at index 4
// フォーマッタの形式が違う場合
try {
    final var date = LocalDate.of(2100, 5, 10);
    final var str = date.format(DateTimeFormatter.ISO_TIME);
} catch (UnsupportedTemporalTypeException e) {
    System.out.println("UnsupportedTemporalTypeException! : " + e.getMessage());
}

// 結果
// ↓
//UnsupportedTemporalTypeException! : Unsupported field: HourOfDay

関連記事

ページの先頭へ