• #Docker
  • #タイムゾーン
  • #make-diary
  • #Claude Code
  • #トラブルシューティング
開発claude-code-toolsメモ

make-diary日記生成のタイムゾーン問題

朝、いつも通り /make-diary を実行した。ログを取得して、日記を生成して、ファイルが並ぶ。手順通り進んだはずだった。生成された日記のフォルダ名を見て手が止まった。2026-03-19 --- 昨日は3/20のはずなのに、3/19分の日記が出てきている。

何が起きたか

日付がずれている

/make-diary コマンドは引数なしで実行すると「昨日の日付」で日記を生成する設計になっている。make-diaryの内部では以下のコマンドで昨日の日付を取得している。

TARGET_DATE=$(date -d 'yesterday' +%Y-%m-%d)

3/21に実行したのだから、TARGET_DATE2026-03-20 になるはず。ところが実際に返ってきた値は 2026-03-19 だった。

生成された3/19分の日記

日付が違うことに気づかないまま、3/19分として以下の記事を生成してしまった。

  • 開発環境改善 --- CapsLockスクリーンショットのAutoHotkey設定など
  • make-diary改善とコンテンツ整理 --- 月別ディレクトリ運用への移行
  • ショート動画戦略のノウハウ集 --- SNSコンサルの知見を体系化
  • sokuroku開発記録 --- Electron + Vue3のリアルタイム文字起こしアプリ

内容自体は正しかった。ログファイルの中身を見て日記を組み立てているので、作業内容は合っている。ただ、この作業内容が紐づいている日付が間違っていた。

原因の特定

DockerコンテナのタイムゾーンがUTC

ターミナルで date を叩いて、原因がすぐ分かった。

$ date
Fri Mar 21 00:15:32 UTC 2026

Docker環境のシステム時刻がUTCになっている。JSTでは3/21の朝9時台だったが、コンテナ内ではまだ3/21の0時台。ここで date -d 'yesterday' を実行すると、UTC基準の「3/20の前日」= 3/20 が返るべきところだが、実際にはsync-once.shの実行タイミングと日付指定の組み合わせで混乱が生じ、3/19のログが取得された。

日付ズレの構造

ローカル(JST):  2026-03-21 09:15  ← 実際の時刻
Docker(UTC)  :  2026-03-21 00:15  ← コンテナの時刻

# JST基準で欲しい「昨日」
JST 3/21 → 昨日は 3/20 ✓

# UTC基準の「昨日」
UTC 3/21 → 昨日は 3/20 ... のはずだが、
sync-once.sh実行時の日付指定との組み合わせで
結果的に3/19のログが処理されてしまった

sync-once.shは日付を引数に受け取り、その日付のログを取得する。make-diaryが算出した TARGET_DATE をsync-once.shに渡すとき、UTC基準の日付とJST基準の期待値がずれていたため、意図しない日付のログが処理された。

修正方法

TZ環境変数でタイムゾーンを指定する

date コマンドの実行時に TZ=Asia/Tokyo を付けるだけで解決する。

# Before: UTCの昨日が返る
TARGET_DATE=$(date -d 'yesterday' +%Y-%m-%d)

# After: JSTの昨日が返る
TARGET_DATE=$(TZ=Asia/Tokyo date -d 'yesterday' +%Y-%m-%d)

あるいは、make-diaryコマンド自体の冒頭で現在日付を確認するステップがあるので、そこでもタイムゾーンを明示する。

# 現在の日付をJST基準で確認
echo "現在の日付(JST): $(TZ=Asia/Tokyo date +%Y-%m-%d)"
echo "現在の日付(UTC): $(date +%Y-%m-%d)"

この差異を目視確認すれば、ズレに気づける。

Dockerfileでタイムゾーンを設定する方法

コンテナ全体のタイムゾーンを変更する方法もある。

ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

ただし、コンテナのシステム時刻を変更すると他のツールにも影響が及ぶ。date コマンドの呼び出し箇所だけ TZ=Asia/Tokyo を付ける方が影響範囲が小さい。

3/20分の日記生成で苦戦

日付間違いに気づいた後、改めて3/20分の日記を生成しようとした。しかし、3/20のclaude-code-syncログがすぐには見つからなかった。

sync-once.shを3/20指定で再実行し、ログを取得し直す必要があった。過去日付を指定するとフルスキャンモードになるため処理時間もかかり、タイムアウトが発生するなど一筋縄ではいかなかった。最終的には3/20分の日記も生成できたが、最初から正しい日付で実行していれば不要な作業だった。

試行錯誤のまとめ

#試したこと結果気づき
1/make-diary を引数なしで実行3/19分の日記が生成された日付がずれていることに気づかず作業を完了
2生成されたフォルダ名を確認2026-03-19 になっていた本来3/20のはず
3Docker内で date を実行UTCの時刻が返ったタイムゾーン未設定だった
4TZ=Asia/Tokyo date を実行JSTの正しい時刻が返った環境変数で解決可能と判明
53/20分の日記を再生成ログ取得からやり直しが必要で時間を要した最初から正しい日付なら不要だった

学んだこと

  • Docker環境では date コマンドがUTCを返す。「昨日」の計算がJSTとずれる
  • TZ=Asia/Tokyodate の前に付けるだけで修正できる。Dockerfile全体を変えるより影響が小さい
  • /make-diary のような日付に依存するスクリプトは、実行冒頭で「今の日付」と「算出したTARGET_DATE」を表示して目視確認するステップがあると間違いに早く気づける
  • 日付間違いに気づいてから巻き戻す作業は、最初から正しく実行する何倍もの手間がかかる

関連