所有服务器必须统一使用utc作为系统基准时区,执行sudo timedatectl set-timezone utc和sudo timedatectl set-local-rtc false,确保timedatectl status显示time zone: utc且rtc in local tz: no;auditd日志须用iso 8601格式含+0000显式标识utc;应用层存储与传输时间戳一律为utc,前端按用户时区渲染;时间同步推荐chrony配置国内ntp源并监控偏移量。

所有服务器统一用UTC,不是为了“看起来标准”,而是让时间有唯一基准、可追溯、不歧义。跨国系统里,时区不是偏好问题,是日志对齐、故障定位和合规审计的硬性前提。
系统时钟必须设为UTC
执行以下命令强制设为UTC:
- sudo timedatectl set-timezone UTC
- sudo timedatectl set-local-rtc false(确保硬件时钟也按UTC保存)
运行 timedatectl status,确认输出中包含:
- Time zone: UTC
- RTC in local TZ: no
- System clock synchronized: yes
这样,date、journalctl、auditd 等所有原生日志打的时间戳默认就是UTC,无需额外转换,也避免因系统时区误配导致日志错位。
auditd日志需显式带+0000时区标识
auditd本身记录的是内核时间(已为UTC),但很多解析工具默认当作本地时间处理。必须让日志自身携带时区信息:
- 用 ausearch --format iso 查看日志,确保时间格式为
2026-04-30T18:57:22.123456+0000 - 若接入ELK/Splunk等平台,应在采集层(如Filebeat或rsyslog)添加时区字段,而不是改系统时钟
- 避免在规则中使用
-F time...类模糊条件,优先用--start/--end配合ISO时间字符串精确过滤
应用与数据库时间处理要分层解耦
系统设UTC,不等于用户看到UTC。关键在于职责分离:
- 后端API、数据库存储一律用UTC时间戳(如
"2026-04-30T10:30:00Z"),禁止存本地时间或依赖date_default_timezone_set() - MySQL:用
DATETIME存UTC值;PostgreSQL:用TIMESTAMP WITH TIME ZONE,连接层设timezone = 'UTC' - 前端根据
Intl.DateTimeFormat或浏览器Intl.DateTimeFormat().resolvedOptions().timeZone自动渲染本地时间
chrony同步要稳且可验证
选 chrony 而非 ntpd,尤其在云环境或网络波动场景下更可靠:
- 配置国内NTP源:
server ntp.aliyun.com iburst、server ntp1.tencent.com iburst - 关键参数加进
/etc/chrony.conf:makestep 1.0 3(允许初同步时步进)、rtcsync(持续同步硬件钟) - 日常检查三步走:
timedatectl status→chronyc tracking→chronyc sourcestats -v,重点关注偏移量是否稳定在 ±5ms 内











