Git提交对象包含author date和committer date两个独立时间戳;前者记录作者提交时刻,后者记录实际提交(如amend或push)时刻,二者时区处理与PHP解析需特别注意统一基准。

Git提交记录里的时间戳有两个,不是错觉
Git 提交对象里确实存着两个独立时间戳:author date 和 committer date。远程仓库(如 GitLab)默认显示的是 author date,也就是你本地执行 git commit 时的那一刻——哪怕你三天后才 git push,界面上仍会写“3月1日”。而 committer date 才是真正推送或 amend 的时间。
常见错误现象:
- 在 CI/CD 日志里看到提交时间比本地晚几小时 → 实际是服务器时区没设对,
committer date被按 UTC 写入 - 用
git log --pretty="%ad" --date=iso查出的时间和网页不一致 → 默认输出的是committer date,加--author-date-order或改用%ad+--date=format:...才能对齐
PHP里解析 Git 时间戳要小心时区陷阱
Git 输出的时间字符串(如 "2026-03-06 14:30:00 +0800")带时区偏移,但 PHP 的 strtotime() 在未调用 date_default_timezone_set() 前,会按系统默认时区(常为 UTC)解析它,导致结果偏差 8 小时。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先设时区:
date_default_timezone_set('Asia/Shanghai');,再用strtotime($git_date_string) - 更稳妥的做法是用
DateTime类:$dt = new DateTime($git_date_string); echo $dt->getTimestamp();—— 它自动识别 ISO 8601 和 RFC 2822 格式中的时区信息 - 避免直接传
"2026-03-06 14:30:00"这种无时区字符串给strtotime(),它会按当前时区解释,不可靠
修改 Git 提交时间戳后,PHP 读取需强制刷新缓存
用 git commit --amend --date="..." 改了 author date 后,PHP 脚本如果之前已通过 git log 命令缓存过结果(比如用 shell_exec() 并做了简单字符串缓存),不会自动感知变更。
容易踩的坑:
- 用
file_get_contents('.git/HEAD')或直接读 refs 文件 → Git 内部格式不保证稳定,且不反映时间戳变更 - 依赖
git log -n1 --format=%at但没加--no-pager→ 在某些终端环境可能卡住或截断输出 - 用
exec("git log -1", $out)却没检查$out是否为空 →git log在空仓库或 detached HEAD 下可能无输出,返回 false 而非 0
time() 返回值不是“北京时间”,别拿它直接比 Git 时间戳
time() 永远返回自 Unix 纪元起的 UTC 秒数,和你的系统时区设置无关。但 Git 的 author date 是带时区的人类可读时间,两者数值可比,但语义不同:一个是绝对时刻(UTC),一个是作者主观记录的本地时刻。
例如,你在 2026-05-25 22:56(CST, +0800)运行 time(),得到的是 1748213760;而同一时刻 Git 记录的 author date 是 "2026-05-25 22:56:00 +0800",经 strtotime() 解析后也是 1748213760 —— 表面一致,但前提是 PHP 时区设对了。一旦漏设,strtotime() 就会把它当 UTC 解析,变成 1748184960(差 8 小时)。
所以比对逻辑必须统一基准:
- 要么全转成 UTC 时间戳比较(推荐)
- 要么都用
DateTime对象,显式指定时区再调getTimestamp() - 别混用
time()和未经处理的git log字符串做直接运算



















