如何让git log的--pretty=format显示本地时区的人类可读日期?
我想用git log配合--pretty=format:自定义输出格式,但在作者日期的显示上遇到了问题——我需要它是人类可读的格式,同时要显示本地时区的时间。
我最初尝试的命令:
$ git log -1 --pretty=format:"%ah" faa7126 Fri Jan 12 00:06
问题在于这个日期没有显示我的本地时区时间(作者时区比我早10小时),甚至连时区标识(比如+0200)都没有。
我可以通过以下命令获取本地时区的时间:
$ git log -1 --date=local --pretty=format:"%ad" faa7126 Thu Jan 11 14:06:51 2024
但这个格式不是我想要的人类可读格式。如果我尝试把两者结合:
$ git log -1 --date=local --pretty=format:"%ah" faa7126 Fri Jan 12 00:06
得到的是人类可读格式,但--date=local并没有生效,依然不是本地时区的时间。
请问怎么才能同时获得人类可读格式和本地时区时间?这是不是Git的bug?
我已经看过相关问题,但那个问题没有涉及人类可读格式的需求。
编辑: 我发现这种行为似乎和提交的时间间隔有关,在特定的提交时长范围内,人类可读格式会自动附加时区标识(比如+0200)。
解决方法
Git的%ah(人类可读的作者日期)确实存在特性限制:它属于Git的"模糊日期"格式,这类格式的时区处理逻辑独立于--date参数,所以--date=local对它不起作用,这是设计逻辑而非bug。
要同时实现本地时区+人类可读样式,可以用以下两种方案:
方案1:自定义日期格式模拟人类可读样式
利用--date=format-local参数自定义输出格式,完全匹配你想要的人类可读效果:
# 不带年份的简洁版 git log -1 --date=format-local:"%a %b %d %H:%M %z" faa7126 # 带年份的完整版(类似%ad的格式) git log -1 --date=format-local:"%a %b %d %H:%M:%S %Y %z" faa7126
这种方式可以精确控制输出内容,同时确保使用本地时区。
方案2:全局配置默认日期格式
如果想让所有git log命令都默认使用该格式,可以修改Git全局配置:
git config --global log.date "format-local:%a %b %d %H:%M %z"
配置完成后,直接使用%ad就能得到符合要求的格式:
git log -1 --pretty=format:"%ad" faa7126
关于时间间隔影响格式的问题
Git的"人类可读"格式(%ah/%ar等)本身就是动态调整的:
- 近期提交(几天内):仅显示日期和时间,省略时区
- 较久远的提交:自动添加年份和时区标识
- 非常旧的提交:可能只显示年份
这是Git的设计初衷——让近期日志更简洁,远期日志保留完整时间信息,并非bug。
内容的提问来源于stack exchange,提问作者JoelFan

