- JAVA
UnsupportedTemporalTypeExceptionの直し方|Java
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で表示 → YearOfEraLocalDateTimeに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期連続の黒字決算。