◉CLAUDE LABEN
●2.1.302 — fork サブエージェントが claude -p・Agent SDK・デスクトップで既定オンになりました。無効化は CLAUDE_CODE_FORK_SUBAGENT=0(10/16)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り43日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.302 — fork サブエージェントが claude -p・Agent SDK・デスクトップで既定オンになりました。無効化は CLAUDE_CODE_FORK_SUBAGENT=0(10/16)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り43日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude Code
⟐ Claude Code/2026-09-03中級

ログのタイムゾーンを表示で寄せるか、記録で固定するか

AdMob とストアのレポートと手元のログで一日の切れ目がずれていました。表示側に寄せる方法と記録側を固定する方法を、実際に往復して選び直した判断の記録です。

Claude Code266タイムゾーンログ設計5個人開発130運用23

✦ プレミアム記事

月初に前月の数字を並べていたときのことです。AdMob の管理画面が示す一日と、App Store Connect の売上レポートが指す一日と、手元のスクリプトが書き出したログの一日が、そろって少しずつずれておりました。

月の合計はほぼ合うのに、日別に並べると端の二日だけが合いません。最初は抽出の取りこぼしを疑って、条件を何度も書き換えました。原因は抽出ではなく、三つのデータがそれぞれ別の「一日の切れ目」を持っていたことでした。

Claude Code の v2.1.257 で Time format と timeZone の設定が入り、タイムスタンプの見え方を手元で決められるようになりました。選択肢が増えたのはありがたいのですが、同時に迷いも増えます——表示を寄せて読みやすくするのか、記録そのものを固定してしまうのか。

私はしばらく前者から入って、あとで戻ってきました。順番を間違えていたのだと気づいたのは、二度目の月初が来たあとでした。その往復で分かったことを書き残します。

表示で寄せる道と、記録で固定する道

二つは目的が違います。混ぜて考えると、どちらを触っているのか自分でも分からなくなります。

観点表示で寄せる記録で固定する
触る場所CLI やビューアの設定ログを書き出すコード
効く範囲これから自分が読む画面だけこれから書かれる全ての行
過去のデータ解釈が変わるだけで中身は同じ過去分は変わらないので移行が要る
他人・他ツールへの影響なし読み手すべてに及ぶ
取り消しやすさ設定を戻すだけ書式が混ざるので戻しにくい

表示側は、Claude Code の設定ファイルに一行足すだけで済みます。

{
  "timeZone": "Asia/Tokyo"
}

記録側は、書き出す関数を通す形になります。私の場合は集計スクリプトの入口に一つ関数を置きました。

from datetime import datetime, timezone, timedelta
 
JST = timezone(timedelta(hours=9))
 
def to_fixed_offset(value, assume=None):
    """ログに書く直前に必ず通す。オフセットの無い値はここで落とします。"""
    if isinstance(value, str):
        # "2026-09-01T03:12:00Z" のような Z 終わりも受けます
        value = datetime.fromisoformat(value.replace("Z", "+00:00"))
    if value.tzinfo is None:
        if assume is None:
            raise ValueError(
                f"オフセットの無い時刻を受け取りました: {value!r} "
                "(取得元のタイムゾーンを assume= で明示してください)"
            )
        value = value.replace(tzinfo=assume)
    # 記録は UTC 固定。読むときに寄せる前提なので、ここでは寄せません
    return value.astimezone(timezone.utc).isoformat(timespec="seconds")

assume を必須にせず、既定値も置かなかったのが要点です。オフセットの無い時刻が来たときに黙って補完してしまうと、どのデータがどの前提で入ってきたのかが二度と分からなくなります。落ちてくれたほうが安全なのです。

表示側に寄せたときに、私が見落としたもの

最初のうち、私は表示側だけで済ませようとしすぎました。設定を一行足せば画面の時刻が全部 JST になりますから、読むのは確かに楽になります。

結果は芳しくありませんでした。表示が揃うと、ずれていることに気づけなくなるのです。

AdMob のレポートは太平洋時間の一日で締まり、App Store Connect の売上レポートはまた別の基準を持ちます。手元のログはコンテナの中で書かれていて UTC でした。それらを画面上で全部 JST に見せてしまうと、三つとも同じ物差しで測られたように見えます。実際には測り方が違うまま並んでいるだけでした。

端の二日だけが合わなかったのは、そのためです。本番運用のデータで起きるこの種の落とし穴は、エラーとして表に出てこないぶん厄介なのかもしれません。真ん中の日はどの基準で切っても大差が出ないので、月の合計を見ているかぎり何も起きていないように見えます。おかしいと気づけるのは月初と月末だけで、そこは同時に「まだ確定していない日」でもあるため、確定待ちだと思って見送っていました。

表示を揃えることは、読みやすさを買う代わりに、差分の手がかりを一つ手放すことでした。 この線引きに気づくまでに、私は同じ集計を三度書き直しております。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦表示と記録のどちらでタイムゾーンを決めるかを、自分の環境の構成から判断できるようになります
✦オフセットが混ざっている箇所を突き合わせの前に見つけられるようになり、数字が合わない原因を丸一日探す事態を避けられます
✦ISO 8601 のオフセット付きで記録を残して表示だけを寄せる形に、自分の集計パイプラインを組み替えられるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ Claude Code2026-08-25
空白ひとつで、80件の検査が0件になる — 一括処理を任せる前に置くガード
空白を含むフォルダ名の下で走らせた検査ループが、80件のうち1件も開いていませんでした。断片が実在パスに化ける仕組みを実測で切り分け、削除を伴うバッチに置く件数アサーションまで書き残します。
⟐ Claude Code2026-10-12
SPM に移したら、起動した瞬間にアプリが落ちるようになりました — dyld の一行を Claude Code と読み解いた記録
CocoaPods から Swift Package Manager へ移した直後、ビルドは通るのに起動した瞬間に落ちました。dyld の一行から原因を切り分け、直し方と確認コマンドまでをまとめます。
⟐ Claude Code2026-09-22
消えたことになっている作業ツリーの棚卸しと、隔離の任せどころ
サブエージェントに任せた隔離作業ツリーが畳まれずに残っていました。git 2.34.1 で実測した remove の可否、消しても残るブランチ、1 ツリーあたり 12 MB の差から、棚卸しの手順と隔離の任せどころをお伝えします。