Claude Code를 하루 이상 열어 둔 장기 세션에서는 모델이 세션 시작 시점의 시간 감각에 머무를 수 있다. SessionStart에 한 번 시간을 넣는 것보다 UserPromptSubmit 이벤트마다 현재 로컬 시간을 주입하는 훅이 더 안정적이다.
문제
세션이 계속 열려 있으면 “오늘”, “어제”, “방금”, “오전 회의 후” 같은 표현이 실제 시간과 어긋날 수 있다. 사용자가 매번 “지금은 2026년 6월 30일 오후…”라고 적는 방식은 작동하지만 반복 비용이 크다.
해결 패턴
Claude Code 훅은 특정 이벤트마다 셸 명령을 실행하고, 그 출력을 모델 컨텍스트에 추가할 수 있다. 시간 주입에는 UserPromptSubmit이 맞다. 이 이벤트는 사용자가 프롬프트를 보낼 때마다 실행되므로, 세션이 밤새 열려 있어도 다음 입력에는 최신 시간이 들어간다.
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "jq -n --arg ctx \"$(date '+%A, %B %-d, %Y at %-I:%M %p %Z (UTC%z)')\" '{hookSpecificOutput:{hookEventName:\"UserPromptSubmit\",additionalContext:(\"Current local date and time: \" + $ctx + \". This is refreshed on every message; use it as your reference for \\\"now\\\" and \\\"today\\\".\")}}'"
}
]
}
]
}
}전역 설정은 보통 ~/.claude/settings.json에 넣는다. 이미 hooks 키가 있다면 덮어쓰지 말고 UserPromptSubmit 항목을 병합한다.
왜 SessionStart가 아닌가
SessionStart는 Claude Code를 시작하거나 세션을 새로 만들 때만 실행된다. 터미널을 열어 둔 채 몇 시간 뒤 다시 입력하는 상황에서는 새 세션이 시작되지 않았으므로 시간이 갱신되지 않는다. “시작 시각을 알려주는 문제”가 아니라 “시간이 흐른다는 사실을 알려주는 문제”이기 때문에 입력마다 실행되는 훅이 필요하다.
적용할 만한 경우
- 하루 종일 유지하는 Claude Code 세션
- 일정, 로그, 배포 시간, 빌드 경과 시간처럼 상대 시간이 중요한 작업
@today, “어제 변경분”, “이번 오전” 같은 표현을 자주 쓰는 팀 워크플로
관련 문서
- claude-code — Anthropic의 터미널 기반 코딩 에이전트
- claude-code-tips-steering — CLAUDE.md, Rules, Skills, Hooks로 동작 제어하기
- claude-code-tips-session-management — 장기 세션 관리와 컨텍스트 운용
참고 자료
- Keep Claude Code Up To Date on Time and Date — Tom McFarlin (2026-06-29)