[{"data":1,"prerenderedAt":613},["ShallowReactive",2],{"content-/make-diary-timezone-issue":3,"all-pages-for-dir":611,"og-image-/make-diary-timezone-issue":612},{"id":4,"title":5,"body":6,"category":592,"description":593,"extension":594,"meta":595,"navigation":266,"ogImage":596,"path":597,"project_name":598,"published":599,"publishedAt":600,"seo":601,"stem":602,"tags":603,"todo":609,"unpublished":599,"updatedAt":596,"__hash__":610},"pages/2026-03/2026-03-21/make-diary-timezone-issue.md","make-diary日記生成コマンドのタイムゾーン問題 - Docker環境でUTCとJSTの日付ズレを修正する",{"type":7,"value":8,"toc":574},"minimark",[9,13,26,30,34,39,86,99,103,106,135,138,141,145,151,186,197,200,208,214,217,221,230,305,308,369,372,376,379,396,405,409,412,415,418,523,526,550,553,570],[10,11,12],"h1",{"id":12},"make-diary日記生成のタイムゾーン問題",[14,15,16,17,21,22,25],"p",{},"朝、いつも通り ",[18,19,20],"code",{},"/make-diary"," を実行した。ログを取得して、日記を生成して、ファイルが並ぶ。手順通り進んだはずだった。生成された日記のフォルダ名を見て手が止まった。",[18,23,24],{},"2026-03-19"," --- 昨日は3/20のはずなのに、3/19分の日記が出てきている。",[27,28,29],"h2",{"id":29},"何が起きたか",[31,32,33],"h3",{"id":33},"日付がずれている",[14,35,36,38],{},[18,37,20],{}," コマンドは引数なしで実行すると「昨日の日付」で日記を生成する設計になっている。make-diaryの内部では以下のコマンドで昨日の日付を取得している。",[40,41,46],"pre",{"className":42,"code":43,"language":44,"meta":45,"style":45},"language-bash shiki shiki-themes vitesse-light vitesse-light","TARGET_DATE=$(date -d 'yesterday' +%Y-%m-%d)\n","bash","",[18,47,48],{"__ignoreMap":45},[49,50,53,57,61,65,69,73,77,80,83],"span",{"class":51,"line":52},"line",1,[49,54,56],{"class":55},"s4oTP","TARGET_DATE",[49,58,60],{"class":59},"shFtX","=$(",[49,62,64],{"class":63},"senZ8","date",[49,66,68],{"class":67},"snbK4"," -d",[49,70,72],{"class":71},"sMJiu"," '",[49,74,76],{"class":75},"sdGka","yesterday",[49,78,79],{"class":71},"'",[49,81,82],{"class":75}," +%Y-%m-%d",[49,84,85],{"class":59},")\n",[14,87,88,89,91,92,95,96,98],{},"3/21に実行したのだから、",[18,90,56],{}," は ",[18,93,94],{},"2026-03-20"," になるはず。ところが実際に返ってきた値は ",[18,97,24],{}," だった。",[31,100,102],{"id":101},"生成された319分の日記","生成された3/19分の日記",[14,104,105],{},"日付が違うことに気づかないまま、3/19分として以下の記事を生成してしまった。",[107,108,109,117,123,129],"ul",{},[110,111,112,116],"li",{},[113,114,115],"strong",{},"開発環境改善"," --- CapsLockスクリーンショットのAutoHotkey設定など",[110,118,119,122],{},[113,120,121],{},"make-diary改善とコンテンツ整理"," --- 月別ディレクトリ運用への移行",[110,124,125,128],{},[113,126,127],{},"ショート動画戦略のノウハウ集"," --- SNSコンサルの知見を体系化",[110,130,131,134],{},[113,132,133],{},"sokuroku開発記録"," --- Electron + Vue3のリアルタイム文字起こしアプリ",[14,136,137],{},"内容自体は正しかった。ログファイルの中身を見て日記を組み立てているので、作業内容は合っている。ただ、この作業内容が紐づいている日付が間違っていた。",[27,139,140],{"id":140},"原因の特定",[31,142,144],{"id":143},"dockerコンテナのタイムゾーンがutc","DockerコンテナのタイムゾーンがUTC",[14,146,147,148,150],{},"ターミナルで ",[18,149,64],{}," を叩いて、原因がすぐ分かった。",[40,152,154],{"className":42,"code":153,"language":44,"meta":45,"style":45},"$ date\nFri Mar 21 00:15:32 UTC 2026\n",[18,155,156,164],{"__ignoreMap":45},[49,157,158,161],{"class":51,"line":52},[49,159,160],{"class":63},"$",[49,162,163],{"class":75}," date\n",[49,165,167,170,173,177,180,183],{"class":51,"line":166},2,[49,168,169],{"class":63},"Fri",[49,171,172],{"class":75}," Mar",[49,174,176],{"class":175},"sM54T"," 21",[49,178,179],{"class":75}," 00:15:32",[49,181,182],{"class":75}," UTC",[49,184,185],{"class":175}," 2026\n",[14,187,188,189,192,193,196],{},"Docker環境のシステム時刻がUTCになっている。JSTでは3/21の朝9時台だったが、コンテナ内ではまだ3/21の0時台。ここで ",[18,190,191],{},"date -d 'yesterday'"," を実行すると、UTC基準の「3/20の前日」= ",[113,194,195],{},"3/20"," が返るべきところだが、実際にはsync-once.shの実行タイミングと日付指定の組み合わせで混乱が生じ、3/19のログが取得された。",[31,198,199],{"id":199},"日付ズレの構造",[40,201,206],{"className":202,"code":204,"language":205},[203],"language-text","ローカル（JST）:  2026-03-21 09:15  ← 実際の時刻\nDocker（UTC）  :  2026-03-21 00:15  ← コンテナの時刻\n\n# JST基準で欲しい「昨日」\nJST 3/21 → 昨日は 3/20 ✓\n\n# UTC基準の「昨日」\nUTC 3/21 → 昨日は 3/20 ... のはずだが、\nsync-once.sh実行時の日付指定との組み合わせで\n結果的に3/19のログが処理されてしまった\n","text",[18,207,204],{"__ignoreMap":45},[14,209,210,211,213],{},"sync-once.shは日付を引数に受け取り、その日付のログを取得する。make-diaryが算出した ",[18,212,56],{}," をsync-once.shに渡すとき、UTC基準の日付とJST基準の期待値がずれていたため、意図しない日付のログが処理された。",[27,215,216],{"id":216},"修正方法",[31,218,220],{"id":219},"tz環境変数でタイムゾーンを指定する","TZ環境変数でタイムゾーンを指定する",[14,222,223,225,226,229],{},[18,224,64],{}," コマンドの実行時に ",[18,227,228],{},"TZ=Asia/Tokyo"," を付けるだけで解決する。",[40,231,233],{"className":42,"code":232,"language":44,"meta":45,"style":45},"# Before: UTCの昨日が返る\nTARGET_DATE=$(date -d 'yesterday' +%Y-%m-%d)\n\n# After: JSTの昨日が返る\nTARGET_DATE=$(TZ=Asia/Tokyo date -d 'yesterday' +%Y-%m-%d)\n",[18,234,235,241,261,268,274],{"__ignoreMap":45},[49,236,237],{"class":51,"line":52},[49,238,240],{"class":239},"sxvE3","# Before: UTCの昨日が返る\n",[49,242,243,245,247,249,251,253,255,257,259],{"class":51,"line":166},[49,244,56],{"class":55},[49,246,60],{"class":59},[49,248,64],{"class":63},[49,250,68],{"class":67},[49,252,72],{"class":71},[49,254,76],{"class":75},[49,256,79],{"class":71},[49,258,82],{"class":75},[49,260,85],{"class":59},[49,262,264],{"class":51,"line":263},3,[49,265,267],{"emptyLinePlaceholder":266},true,"\n",[49,269,271],{"class":51,"line":270},4,[49,272,273],{"class":239},"# After: JSTの昨日が返る\n",[49,275,277,279,281,284,287,290,293,295,297,299,301,303],{"class":51,"line":276},5,[49,278,56],{"class":55},[49,280,60],{"class":59},[49,282,283],{"class":55},"TZ",[49,285,286],{"class":59},"=",[49,288,289],{"class":75},"Asia/Tokyo",[49,291,292],{"class":63}," date",[49,294,68],{"class":67},[49,296,72],{"class":71},[49,298,76],{"class":75},[49,300,79],{"class":71},[49,302,82],{"class":75},[49,304,85],{"class":59},[14,306,307],{},"あるいは、make-diaryコマンド自体の冒頭で現在日付を確認するステップがあるので、そこでもタイムゾーンを明示する。",[40,309,311],{"className":42,"code":310,"language":44,"meta":45,"style":45},"# 現在の日付をJST基準で確認\necho \"現在の日付（JST）: $(TZ=Asia/Tokyo date +%Y-%m-%d)\"\necho \"現在の日付（UTC）: $(date +%Y-%m-%d)\"\n",[18,312,313,318,350],{"__ignoreMap":45},[49,314,315],{"class":51,"line":52},[49,316,317],{"class":239},"# 現在の日付をJST基準で確認\n",[49,319,320,324,327,330,333,335,337,340,342,344,347],{"class":51,"line":166},[49,321,323],{"class":322},"sz8Xr","echo",[49,325,326],{"class":71}," \"",[49,328,329],{"class":75},"現在の日付（JST）: ",[49,331,332],{"class":59},"$(",[49,334,283],{"class":75},[49,336,286],{"class":59},[49,338,339],{"class":75},"Asia/Tokyo ",[49,341,64],{"class":63},[49,343,82],{"class":75},[49,345,346],{"class":59},")",[49,348,349],{"class":71},"\"\n",[49,351,352,354,356,359,361,363,365,367],{"class":51,"line":263},[49,353,323],{"class":322},[49,355,326],{"class":71},[49,357,358],{"class":75},"現在の日付（UTC）: ",[49,360,332],{"class":59},[49,362,64],{"class":63},[49,364,82],{"class":75},[49,366,346],{"class":59},[49,368,349],{"class":71},[14,370,371],{},"この差異を目視確認すれば、ズレに気づける。",[31,373,375],{"id":374},"dockerfileでタイムゾーンを設定する方法","Dockerfileでタイムゾーンを設定する方法",[14,377,378],{},"コンテナ全体のタイムゾーンを変更する方法もある。",[40,380,384],{"className":381,"code":382,"language":383,"meta":45,"style":45},"language-dockerfile shiki shiki-themes vitesse-light vitesse-light","ENV TZ=Asia/Tokyo\nRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone\n","dockerfile",[18,385,386,391],{"__ignoreMap":45},[49,387,388],{"class":51,"line":52},[49,389,390],{},"ENV TZ=Asia/Tokyo\n",[49,392,393],{"class":51,"line":166},[49,394,395],{},"RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone\n",[14,397,398,399,401,402,404],{},"ただし、コンテナのシステム時刻を変更すると他のツールにも影響が及ぶ。",[18,400,64],{}," コマンドの呼び出し箇所だけ ",[18,403,228],{}," を付ける方が影響範囲が小さい。",[27,406,408],{"id":407},"_320分の日記生成で苦戦","3/20分の日記生成で苦戦",[14,410,411],{},"日付間違いに気づいた後、改めて3/20分の日記を生成しようとした。しかし、3/20のclaude-code-syncログがすぐには見つからなかった。",[14,413,414],{},"sync-once.shを3/20指定で再実行し、ログを取得し直す必要があった。過去日付を指定するとフルスキャンモードになるため処理時間もかかり、タイムアウトが発生するなど一筋縄ではいかなかった。最終的には3/20分の日記も生成できたが、最初から正しい日付で実行していれば不要な作業だった。",[27,416,417],{"id":417},"試行錯誤のまとめ",[419,420,421,440],"table",{},[422,423,424],"thead",{},[425,426,427,431,434,437],"tr",{},[428,429,430],"th",{},"#",[428,432,433],{},"試したこと",[428,435,436],{},"結果",[428,438,439],{},"気づき",[441,442,443,460,476,493,509],"tbody",{},[425,444,445,449,454,457],{},[446,447,448],"td",{},"1",[446,450,451,453],{},[18,452,20],{}," を引数なしで実行",[446,455,456],{},"3/19分の日記が生成された",[446,458,459],{},"日付がずれていることに気づかず作業を完了",[425,461,462,465,468,473],{},[446,463,464],{},"2",[446,466,467],{},"生成されたフォルダ名を確認",[446,469,470,472],{},[18,471,24],{}," になっていた",[446,474,475],{},"本来3/20のはず",[425,477,478,481,487,490],{},[446,479,480],{},"3",[446,482,483,484,486],{},"Docker内で ",[18,485,64],{}," を実行",[446,488,489],{},"UTCの時刻が返った",[446,491,492],{},"タイムゾーン未設定だった",[425,494,495,498,503,506],{},[446,496,497],{},"4",[446,499,500,486],{},[18,501,502],{},"TZ=Asia/Tokyo date",[446,504,505],{},"JSTの正しい時刻が返った",[446,507,508],{},"環境変数で解決可能と判明",[425,510,511,514,517,520],{},[446,512,513],{},"5",[446,515,516],{},"3/20分の日記を再生成",[446,518,519],{},"ログ取得からやり直しが必要で時間を要した",[446,521,522],{},"最初から正しい日付なら不要だった",[27,524,525],{"id":525},"学んだこと",[107,527,528,534,542,547],{},[110,529,530,531,533],{},"Docker環境では ",[18,532,64],{}," コマンドがUTCを返す。「昨日」の計算がJSTとずれる",[110,535,536,538,539,541],{},[18,537,228],{}," を ",[18,540,64],{}," の前に付けるだけで修正できる。Dockerfile全体を変えるより影響が小さい",[110,543,544,546],{},[18,545,20],{}," のような日付に依存するスクリプトは、実行冒頭で「今の日付」と「算出したTARGET_DATE」を表示して目視確認するステップがあると間違いに早く気づける",[110,548,549],{},"日付間違いに気づいてから巻き戻す作業は、最初から正しく実行する何倍もの手間がかかる",[27,551,552],{"id":552},"関連",[107,554,555,563],{},[110,556,557,562],{},[558,559,561],"a",{"href":560},"/2026-03-19-diary","2026年3月19日の開発日記"," --- 日付ズレで生成された3/19分の日記（内容自体は正しい）",[110,564,565,569],{},[558,566,568],{"href":567},"/2026-03-20-diary","2026年3月20日の開発日記"," --- 後から再生成した3/20分の日記",[571,572,573],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}",{"title":45,"searchDepth":166,"depth":166,"links":575},[576,580,584,588,589,590,591],{"id":29,"depth":166,"text":29,"children":577},[578,579],{"id":33,"depth":263,"text":33},{"id":101,"depth":263,"text":102},{"id":140,"depth":166,"text":140,"children":581},[582,583],{"id":143,"depth":263,"text":144},{"id":199,"depth":263,"text":199},{"id":216,"depth":166,"text":216,"children":585},[586,587],{"id":219,"depth":263,"text":220},{"id":374,"depth":263,"text":375},{"id":407,"depth":166,"text":408},{"id":417,"depth":166,"text":417},{"id":525,"depth":166,"text":525},{"id":552,"depth":166,"text":552},"dev","Claude Codeのmake-diaryコマンドをDocker環境で実行したら、生成される日記の日付が1日ずれた。原因はDockerコンテナのタイムゾーンがUTCだったこと。TZ=Asia/Tokyoで解決するまでの試行錯誤を記録。","md",{},null,"/make-diary-timezone-issue","claude-code-tools",false,"2026-03-21T00:00:00.000Z",{"title":5,"description":593},"2026-03/2026-03-21/make-diary-timezone-issue",[604,605,606,607,608],"Docker","タイムゾーン","make-diary","Claude Code","トラブルシューティング","memo","5Kw8x0QJaMasJqPd-9S_64xagG78PlX2AIvZg-AF2_0",[],"https://log.eurekapu.com/og/blog/make-diary-timezone-issue.png?v=2026-03-21T00%3A00%3A00.000Z&title=make-diary%E6%97%A5%E8%A8%98%E7%94%9F%E6%88%90%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E5%95%8F%E9%A1%8C%20-%20Docker%E7%92%B0%E5%A2%83%E3%81%A7UTC%E3%81%A8JST%E3%81%AE%E6%97%A5%E4%BB%98%E3%82%BA%E3%83%AC%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%99%E3%82%8B&author=Kei%20Komatsu&sig=56f71fa5ffd2647a",1782528819680]