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_DATE は 2026-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のはず |
| 3 | Docker内で date を実行 | UTCの時刻が返った | タイムゾーン未設定だった |
| 4 | TZ=Asia/Tokyo date を実行 | JSTの正しい時刻が返った | 環境変数で解決可能と判明 |
| 5 | 3/20分の日記を再生成 | ログ取得からやり直しが必要で時間を要した | 最初から正しい日付なら不要だった |
学んだこと
- Docker環境では
dateコマンドがUTCを返す。「昨日」の計算がJSTとずれる TZ=Asia/Tokyoをdateの前に付けるだけで修正できる。Dockerfile全体を変えるより影響が小さい/make-diaryのような日付に依存するスクリプトは、実行冒頭で「今の日付」と「算出したTARGET_DATE」を表示して目視確認するステップがあると間違いに早く気づける- 日付間違いに気づいてから巻き戻す作業は、最初から正しく実行する何倍もの手間がかかる
関連
- 2026年3月19日の開発日記 --- 日付ズレで生成された3/19分の日記(内容自体は正しい)
- 2026年3月20日の開発日記 --- 後から再生成した3/20分の日記