java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay は、日付・時刻の型が持っていない項目(この例では「時」)を、表示や計算で使おうとしたときの例外です。 LocalDate(日付だけ)を "yyyy/MM/dd HH:mm" で表示したときによく起きます。

エラー文の Unsupported field: のあとの名前で、足りない項目が分かります。

エラー文 足りない項目 よくある原因 直し方
Unsupported field: HourOfDay 時(HH) LocalDate を HH:mm で表示 LocalDateTime を使う、または書式から HH:mm を外す
Unsupported field: YearOfEra 年(yyyy) LocalTime を yyyy で表示、Instant を ofPattern で表示 日付のある型を使う、Instant は withZone
Unsupported field: OffsetSeconds UTC からの時差(XXX) LocalDateTime を XXX で表示 OffsetDateTime・ZonedDateTime を使う
Unable to extract ZoneId from temporal タイムゾーン(z) LocalDateTime を z で表示 ZonedDateTime を使う
Unsupported unit: Hours・Seconds 時間の単位 LocalDate に時間を足す、Duration.between(LocalDate, ...) Period・ChronoUnit.DAYS を使う

確認環境:OpenJDK 21(同じ例を JDK 8 でも実行)。2026年10月11日の日付で確かめました(確認日 2026年10月11日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「UnsupportedTemporalTypeExceptionの直し方|Java」

型ごとに、持っている項目が違う

型 年月日 時分秒 時差・タイムゾーン
LocalDate ある ない ない
LocalTime ない ある ない
LocalDateTime ある ある ない
ZonedDateTime・OffsetDateTime ある ある ある
Instant (そのままでは表示できない)

書式(DateTimeFormatter)に書いた項目を、型が持っていないと例外になります。 LocalDate.isSupported(ChronoField.HOUR_OF_DAY) は false でした。

再現:書式と型の組み合わせ

LocalDate d = LocalDate.of(2026, 10, 11);
d.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"));
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay
書いたコード 結果(JDK 21)
LocalDate を "yyyy/MM/dd HH:mm" Unsupported field: HourOfDay
LocalDate.atStartOfDay() を "yyyy/MM/dd HH:mm" 2026/10/11 00:00
LocalTime を "yyyy/MM/dd HH:mm" Unsupported field: YearOfEra
LocalDateTime を "yyyy-MM-dd HH:mm z" Unable to extract ZoneId from temporal 2026-10-11T09:05:07
LocalDateTime を "yyyy-MM-dd'T'HH:mmXXX" Unsupported field: OffsetSeconds
ZonedDateTime(Asia/Tokyo)を "yyyy-MM-dd HH:mm z" 2026-10-11 09:05 JST
LocalDate を ISO_DATE_TIME Unsupported field: HourOfDay

ISO_DATE_TIME のような用意された書式でも、型が合わないと同じ例外になりました。 LocalDateTime の z は、JDK 8 では Unable to extract value: class java.time.LocalDateTime と、メッセージが違いました。

DB から取った日付で起きやすい

DB の DATE 型の列を LocalDate で受け取り、画面では「日時」の書式で表示しようとして起きることがあります。表示する項目に時刻があるなら、DB の列も DATETIME・TIMESTAMP にして LocalDateTime で受け取ります。日付しか無いなら、書式から HH:mm を外します。

Instant は ofPattern でそのまま表示できない

Instant in = Instant.parse("2026-10-11T00:05:07Z");
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm").format(in);
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra

Instant は「世界で共通のある瞬間」で、タイムゾーンが決まらないと「何年何月何日何時」に変えられません。 withZone でタイムゾーンを指定すると表示できました。

DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm").withZone(ZoneId.of("Asia/Tokyo")).format(in);
// 2026/10/11 09:05

Java の公式ドキュメントでも、withZone を指定すると、Instant はそのタイムゾーンの日時に変換して表示されると説明されています。

Unsupported unit(計算のとき)

書いたコード 結果
LocalDate.plus(1, ChronoUnit.HOURS) Unsupported unit: Hours
Duration.between(LocalDate, LocalDate) Unsupported unit: Seconds
ChronoUnit.HOURS.between(LocalDate, LocalDate) Unsupported unit: Hours
ChronoUnit.DAYS.between(LocalDate, LocalDate) 1

Duration は秒単位の長さなので、日付だけの LocalDate では使えません。 日数の差は ChronoUnit.DAYS.between、年月日の差は Period.between を使います。差分の計算は、既存の記事「Java 日付の差分計算|ChronoUnit・Period・Duration」で扱っています。

例外にならない書式の間違い

書式 表示した日時 結果 注意
"hh:mm"(小文字の hh) 15時5分 03:05 12時間制。"hh:mm a"(Locale.JAPAN)なら 03:05 午後
"YYYY/MM/dd"(大文字の YYYY) 2026年12月28日 2027/12/28 週の年。年末に1年ずれる

公式ドキュメントの書式の表では、y は年、Y は週を基準にした年、H は 0〜23 時、h は 1〜12 時です。 例外にならないので、年末や午後のデータで初めて気づきます。書式の一覧は、既存の記事「Java DateTimeFormatterパターン一覧|日付と文字列の変換」で扱っています。

確認の手順(チェックリスト)

順番 確認すること 方法
1 Unsupported field: のあとの名前 HourOfDay・YearOfEra・OffsetSeconds
2 使っている型 LocalDate・LocalTime・LocalDateTime・Instant
3 書式の文字 HH・yyyy・z・XXX
4 型を変えるか、書式を変えるか 時刻が必要なら LocalDateTime
5 Instant なら withZone(ZoneId.of("Asia/Tokyo"))
6 計算なら Duration ではなく Period・ChronoUnit.DAYS

よくある質問

Q. 文字列から日付に変えるとき(parse)のエラーとは違いますか。 A. 違います。parse のときは DateTimeParseException が出ます。関連記事の「DateTimeParseExceptionの原因と直し方|Java日付の解析」で扱っています。

まとめ

  • 型が持っていない項目を、書式や計算で使った例外
  • LocalDate を HH:mm で表示 → HourOfDay、Instant を ofPattern で表示 → YearOfEra
  • LocalDateTime に z・XXX は使えない。ZonedDateTime・OffsetDateTime を使う
  • Instant は withZone でタイムゾーンを指定する
  • Duration は LocalDate に使えない。Period・ChronoUnit.DAYS

参考・出典

確認日はいずれも 2026年10月11日です。

  • Java SE 21 API「DateTimeFormatter」(書式の文字と withZone):https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/time/format/DateTimeFormatter.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「UnsupportedTemporalTypeExceptionの直し方|Java」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?