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 |
|
yyyy年MM月dd日 |
|
|
文字列 → 日付 | ISO 8601 |
|
yyyy年MM月dd日 |
|
|
時刻 → 文字列 | ISO 8601 |
|
HH時mm分ss秒 |
|
|
文字列 → 時刻 | ISO 8601 |
|
HH時mm分ss秒 |
|
|
日時 → 文字列 | ISO 8601 |
|
yyyy年MM月dd日 HH時mm分ss秒 |
|
|
文字列 → 日時 | ISO 8601 |
|
yyyy年MM月dd日 HH時mm分ss秒 |
|
文字列表記
日付・時刻を文字列に変換するためには、まず日付・時刻をどのような表記にするのか、というのを決めなければなりません。
例えば、日本語では "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
関連記事
- 日付・時刻の基本
- Date, CalendarではなくLocalDateTime, ZonedDateTimeを使おう
- 日時と曜日の計算
- 現在時刻(日時)の取得いろいろ
- 現在の曜日(DayOfWeek)を取得
- ZoneIdとZoneOffsetの違い
- API 使用例
- DateTimeException (日付・時刻の例外)
- DateTimeParseException (日付・時刻の解析例外)
- DayOfWeek (曜日)
- Duration (時間の量)
- LocalDate (日付・タイムゾーンなし)
- LocalDateTime (日時・タイムゾーンなし)
- LocalTime (時刻・タイムゾーンなし)
- Month (月)
- Instant (時点)
- OffsetDateTime (日時・オフセットあり)
- OffsetTime (時刻・オフセットあり)
- Period (日付の量)
- TemporalAdjusters (日時の調整ユーティリティ)
- Year (年)
- ZonedDateTime (日時・タイムゾーンあり)
- ZoneId (タイムゾーンID)
- ZoneOffset (タイムゾーン・オフセット)