Linux 时区、系统时间与 tmux 状态栏时间不一致的排查
我把 Linux 的时区设成 Asia/Tokyo,又手动设置了系统时间,但 tmux 右侧状态栏仍慢一个小时。例如,系统显示 14:37 JST,tmux 却显示 13:37 CST。问题不在 timedatectl set-time:一个早已启动的 tmux server 仍按旧时区格式化状态栏。
|
|
时区和系统时间是两件事
系统时钟记录的是同一个时间点;时区决定它如何显示。东京是 UTC+9,上海是 UTC+8,因此同一个时间点在东京显示 14:36 时,在上海显示 13:36。如果只是要把系统从东京时区改为上海时区,执行:
|
|
这一步不需要再运行 set-time。反过来,如果要保留东京时区,就设置为:
|
|
timedatectl 会显示 Time zone、Local time、Universal time 和时间同步状态。date 则方便核对当前 shell 看到的本地时间与 UTC 偏移量。东京应显示 JST +0900。如果只是想临时查看上海时间,而不更改系统设置,可以运行:
|
|
系统时钟确实错误时,再设置时间
优先让系统自动同步时间:
|
|
如果无法使用自动同步,先关闭它,再输入当前系统时区下的日期和时间。例如系统时区为 Asia/Tokyo 时:
|
|
上面的日期和时间只是示例,不能原样当作现在的时间使用。set-time 修改系统时钟;set-timezone 修改本地时间的显示规则。如果启用了时间同步服务,手动设置的时间之后可能被同步服务校正。
为什么 tmux 仍慢一个小时
这次排查时,系统时钟和 tmux 自己格式化的时钟分别显示:
|
|
可以用以下命令分别检查,不必凭状态栏猜测:
|
|
该 tmux server 在修改系统时区之前已经运行了多日,状态栏配置又直接使用 %b%d 和 %H:%M:%S。tmux 因而继续用旧时区格式化这部分内容。重复执行 timedatectl set-time 只会把正确的系统时钟改错。
不关闭 tmux 会话的临时修复
tmux 的状态栏支持 #(command),可以改由新启动的 date 进程生成东京时间。下面的脚本只替换当前 status-right 里的日期和时间格式,保留其余样式,并把原值存进 tmux 的用户选项中:
|
|
tmux 会先处理状态栏中的 %,所以传给 date 的格式符要写成 %%。这个修复立即作用于正在运行的 tmux server,不会关闭 pane 或 session。如果要恢复原状态栏配置:
|
|
这是运行时设置;重新加载 tmux 配置后可能被原配置覆盖。之后如果重启 tmux server,它会读取当前系统时区;但 tmux kill-server 会终止所有 tmux 会话及其中运行的程序,应先保存工作。
参考
相关内容
- tmux 设置默认 zsh
- Linux开发环境一键部署
- 配置强大终端: zsh+tmux+powerline+autojump
- zsh compinit: insecure directories, run compaudit for list
- c++ 内存对齐
支付宝
微信

william