直接使用 date -s 修改系統時間「看似生效」但實際無效,根因是系統時區未正確設定。 系統內核維護的是 UTC 時間,顯示給用戶的是「UTC + 時區偏移」。若時區檔案錯誤或缺失,修改後的時間會被錯誤偏移顯示,導致以為修改失敗。
# 備份原有檔案(如存在)
cp /etc/localtime /etc/localtime.bak.$(date +%s)
# 複製正確時區檔案(以中國標準時間為例)
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 驗證
ls -l /etc/localtime
date # 應顯示正確的本地時間
/usr/share/zoneinfo/ 為系統時區資料庫(tzdata 套件提供)Asia/Shanghai、Asia/Taipei、UTC、America/New_York
cat > /etc/sysconfig/clock << 'EOF'
ZONE="Asia/Shanghai"
UTC=true
ARC=false
EOF
參數說明:
- ZONE:時區識別符,需與
/usr/share/zoneinfo/下路徑一致- UTC=true:硬體時鐘 (RTC) 儲存 UTC 時間(推薦,避免夏令時/雙系統衝突)
- UTC=false:硬體時鐘儲存本地時間(Windows 預設,雙啟動建議)
- ARC=false:非 Alpha 架構(歷史參數,現代 x86/ARM 均為 false)
# 安裝 NTP 套件(若未安裝)
yum install -y ntp ntpdate # CentOS/RHEL 7
dnf install -y ntp ntpdate # CentOS/RHEL 8+/Fedora
apt update && apt install -y ntp ntpdate # Debian/Ubuntu
# 立即同步(選擇就近伺服器)
ntpdate -u 0.asia.pool.ntp.org
# 或
ntpdate -u time.cloudflare.com
# 或
ntpdate -u ntp.aliyun.com
# 啟用並設定開機自動同步
systemctl enable --now ntpd
# 或使用 systemd-timesyncd (輕量級)
systemctl enable --now systemd-timesyncd
# 1. 系統時間
date
# 2. 硬體時鐘
hwclock --show
# 3. 時區確認
timedatectl status
# 4. NTP 同步狀態
ntpq -p
# 或
chronyc sources # 若使用 chrony
systemd 系統(CentOS 7+、Ubuntu 16.04+、Debian 8+)推薦統一使用 timedatectl:
# 列出所有时区
timedatectl list-timezones | grep -i shanghai
# 设置时区
timedatectl set-timezone Asia/Shanghai
# 设置时间(會自動同步硬體時鐘)
timedatectl set-time "2024-01-15 14:30:00"
# 启用 NTP 同步
timedatectl set-ntp true
# 查看状态
timedatectl status
| 誤區 | 後果 | 正確做法 |
|---|---|---|
只執行 date -s "..." | 重啟後失效、顯示錯誤、日誌時間亂序 | 必須設定時區 + 同步 NTP + 寫入硬體時鐘 |
修改 /etc/localtime 但未更新 /etc/sysconfig/clock | 部分工具(如 hwclock)讀取錯誤配置 | 兩者保持一致,或改用 timedatectl |
| 硬體時鐘設為本地時間 (UTC=false) 但未處理夏令時 | 每年兩次時間偏移 1 小時 | 優先使用 UTC=true,或確認系統支援夏令時自動切換 |
| 容器內直接修改宿主機時間 | 權限不足、影響宿主機所有容器 | 容器掛載 /etc/localtime:ro,時間同步由宿主機負責 |
docker run -v /etc/localtime:/etc/localtime:ro ... 共享宿主機時區