[BUG] No local time or timezone in context - Claude reasons about time-of-day in UTC and says this evening in the morning

Status Open
Reported on v2.1.220
Maintainer reply None cached
Activity 6 comments · opened Aug 5, 2026

Summary

The system prompt gives Claude a bare calendar date with no time and no timezone, while the
only timestamps otherwise present in its context (session transcript entries) are UTC. The
model therefore has no local-time signal at all, and when it reasons about time of day it
lands on UTC. On a UTC-5 machine this means Claude says "this afternoon" at 7am and "this
evening" before lunch, repeatedly, across sessions.

This is upstream of #64988 (times Claude reports defaulting to UTC) and #81395 (/usage
display timezone). Those are about rendering a time Claude already knows. Here Claude never
knows the local time in the first place, so no amount of correcting the display layer fixes it.

What Claude receives

The injected line is exactly:

Today's date is 2026-08-05.

No hour, no minute, no timezone name, no UTC offset. Meanwhile transcript entries in
~/.claude/projects/<project>/<session>.jsonl are written as:

{"timestamp":"2026-08-05T12:08:42.941Z", ...}

So the one clock reading reachable from context is UTC, unlabelled as "not yours".

Reproduction

  1. Set the system timezone to anything with a meaningful UTC offset. Mine is

America/Chicago (CDT, UTC-5); the effect gets worse the further from UTC you are.

  1. Start a session in the morning, local time.
  2. Ask Claude something that makes it refer to the current time of day, e.g. "summarize what

we did this morning" or just let it narrate ("I'll pick this up this evening").

Observed at 07:10 CDT:

$ date
Wed Aug  5 07:10:17 CDT 2026
$ date -u
Wed Aug  5 12:10:17 UTC 2026

Claude treats it as roughly midday-to-afternoon. Users in UTC+8 through UTC+12 get the
mirror-image failure, where Claude is hours behind them.

Expected

Claude should be able to tell what time it is where the user is. Any of these would do it,
roughly in order of preference:

  1. Include local time and IANA zone in the same injected line, e.g.

Today's date is 2026-08-05. Local time is 07:10 (America/Chicago, UTC-05:00).
The binary already resolves the local zone via Intl for other purposes, so the value is
in hand.

  1. Failing that, include the UTC offset alongside the date so the model can convert

the UTC transcript timestamps itself.

  1. At minimum, label the transcript timestamps as UTC where they surface in context, so the

model stops silently reading them as wall-clock local.

Untested corollary worth checking

If the injected date is itself derived in UTC rather than local time, then for UTC-negative
users the date is also wrong for the last few hours of every day — at 19:30 CDT, UTC has
already rolled over to the next calendar day. I have not confirmed which way this one goes;
the time-of-day problem above reproduces regardless. Note #51110 was the same class of bug in
routines and was fixed there.

Workaround

Same shape as the one in #64988: a CLAUDE.md rule telling Claude to run date before making
any time-of-day statement. It works, but it costs a tool call to learn something that should
have arrived with the prompt, and it only fires when Claude remembers to consult the rule.

Environment

  • Claude Code 2.1.220
  • Windows 11 Pro 10.0.26200, VS Code extension
  • System timezone: America/Chicago (CDT, UTC-5 at time of writing)
  • Reproduces independent of model choice

View original on GitHub ↗

3 Comments

ngoanpv · 2 months ago

Seeing the same thing from the other side of UTC — I'm in Vietnam (ICT, UTC+7), and Claude runs hours behind me, the mirror-image failure the description predicts.

In my case it happened in a scheduled Routine created from the desktop app: around 14:46 local time, the Routine's session claimed it was "06:46 in the morning" (the reply was in Vietnamese: "Bây giờ mới 06:46 sáng") — so it was reasoning from roughly the server/UTC clock, not mine.

One thing worth adding for the fix discussion: these Routine sessions are cloud-hosted (mine clearly wasn't using my machine's clock), so reading date/TZ/the system timezone can never recover the user's local time in that mode — only your first option (injecting the user's local time + IANA zone, e.g. Asia/Ho_Chi_Minh, from the client side) covers both local sessions and cloud Routines.

Environment: Claude desktop app 1.25927.0 (003700), macOS 26.5.2 (25F84).

wshallwshall · 1 month ago

Still relevant. The system prompt still supplies a bare calendar date with no time and no timezone, while the surrounding transcript timestamps are UTC, so the model has no local-time signal and lands on UTC whenever it reasons about time of day.

Per the report, this is upstream of both #64988 and #81395. Those describe times the model reports and displays being wrong. This is why the model has nothing better to reason from in the first place.

The fix shape is small: a local timestamp or an IANA timezone in context, rather than a date alone.

wshallwshall · 1 month ago

Still open. This is upstream of #64988 and #81395, and I would ask that it not be folded into either. Those are about rendering a time the model already knows. Here the model never receives a local time at all.

The injected line is a bare calendar date with no hour, no timezone name and no offset. The only timestamps otherwise reachable from context are transcript entries in ~/.claude/projects/, written as UTC and not labelled as "not yours". So when the model reasons about time of day, UTC is the only clock reading available to it, and it uses it.

On a UTC-5 machine the result is the model saying "this afternoon" at 7am and "this evening" before lunch, repeatedly, across sessions. No change to the display layer fixes that, because the wrong value is being reasoned with rather than reported. A timezone name or offset on the injected line would be enough.

Showing cached comments. Read the full discussion on GitHub ↗