Hugoで記事が表示されない?

Hugoを使って記事を書いていたところ、記事が表示されないという現象に遭遇した。フロントマターに draft: false を設定しており、ファイル名やフォルダ構成にも問題はない。ビルドエラーも出ていない。それでも記事が出ない。

その原因は、日付フィールドが“未来”として扱われていたためだった。日本時間では「今日」でも、Hugoの内部処理では「まだ未来」だったのである。


Hugoの内部時間処理はUTC基準

Hugoでは、Markdown記事のフロントマターで指定する date: フィールドが、内部的に UTC(協定世界時)基準で解釈されている。そのため、たとえば日本時間で 2025-05-09 を指定した場合でも、

  • 日本時間(JST)では5月9日 → 午前中
  • UTCではまだ5月8日

という時差がある。この状態でHugoを通常起動すると、「未来記事」として非表示扱いされる

これは特に index.md を使った Leaf Bundle構成の記事や、content/ 以下に日付ベースで管理している場合に混乱を招きやすい。


初心者が気づきにくい理由

この挙動が厄介なのは、以下のような要因があるためだ:

  • ビルドしてもエラーが出ない
  • hugo server を使っても、記事が非表示である理由の明示はない
  • draft: false にしていても関係なく非表示になる
  • フォルダ構成やテーマ設定の問題と勘違いしやすい

結果として、「なぜか記事が出ない」という状態に陥り、構文ミス・設定ミスなどを疑って時間を浪費することになる。


対策①:date: を「過去日」にする

もっとも単純で確実な解決法は、フロントマターの日付を現在の日本時間より確実に過去の日付にしておくことである。

例:

date: "2025-05-08"

記事の執筆日と公開日を分ける設計にしておけば、JSTとUTCのズレによる非表示問題を防げる。


対策②:--buildFuture を付けて起動する

開発中で、あえて未来日付で記事を作成したい場合は、Hugoの起動オプションに --buildFuture を付けると、未来日付の記事もビルド対象になる。

hugo server --buildFuture

ただし本番環境では、hugo 単体でビルドする限りこのオプションは無効なので注意。


対策③:ISO 8601形式でタイムゾーンを明示する(限定的)

タイムゾーンを明示した形式:

date: "2025-05-09T00:00:00+09:00"

Papermodなど一部のテーマではこの表記に対応しているが、Hugo本体の表示制御には影響しない。表示可否に関しては、依然としてUTC基準で判断されるため、根本的な解決にはならない。


まとめ:日付の罠を避けるには

Hugoでは、date: フィールドがUTC基準で処理されるという前提を押さえておくことが重要である。記事が表示されない場合、構文や構成ミスの前に「日付が未来になっていないか」を確認するのが鉄則だ。

実務上は、

  • date: は1日前など、明示的に過去日に設定する
  • --buildFuture は開発時限定で使う

といった運用を取り入れることで、この静かに発動する“非表示バグ”を回避できる。

この挙動を知っているだけで、Hugo運用はぐっと安定するだろう。