本文详细介绍如何在 Linux 系统上修改日期、时间和时区,适用于 CentOS、RHEL、Ubuntu、Debian、Rocky Linux、AlmaLinux 等主流发行版。
应用场景:
系统时间配置在以下场景中至关重要:
- 服务器部署和初始化配置
- 跨时区业务系统部署
- 日志记录和审计要求
- 证书和加密服务依赖准确时间
- 分布式系统时间同步
无论您使用的是香港独立服务器、新加坡VPS还是其他地区的服务器,正确配置系统时间都是系统管理的基础工作。
准备工作:
在开始修改系统时间之前,请注意以下几点:
- 需要 root 权限: 所有时间修改操作都需要 root 或 sudo 权限
- 了解当前系统: 确认您使用的 Linux 发行版和版本
- 备份重要配置: 虽然修改时间不会影响数据,但建议备份时区配置文件
- 检查依赖服务: 某些服务对时间变化敏感,修改前请做好规划
- 考虑使用 NTP: 对于生产环境,建议使用网络时间协议(NTP)自动同步时间
重要提示: 在生产环境中随意修改时间可能导致数据库、日志、证书等服务出现问题。建议在维护窗口期间操作,并提前通知相关人员。
方法一:使用 date 命令修改时间(传统方法)
date 命令是 Linux 系统中最基础的时间管理工具,适用于所有 Linux 发行版。
查看当前系统时间:
date
输出示例:
Wed Dec 18 10:30:45 CST 2025
修改日期:
将日期设置为 2025 年 12 月 25 日:
date -s "2025-12-25"
或使用简写格式:
date -s "12/25/2025"
或使用另一种格式:
date -s "20251225"
修改时间:
将时间设置为上午 10:30:00:
date -s "10:30:00"
或包含秒数:
date -s "10:30:45"
同时修改日期和时间:
这是最常用也最推荐的方法,一次性设置完整的日期时间:
date -s "2025-12-25 10:30:00"
或使用其他格式:
date -s "2025/12/25 10:30:00"
验证修改结果:
date
将系统时间写入硬件时钟(重要步骤):
修改系统时间后,必须将新时间同步到 BIOS 硬件时钟,否则重启后会恢复原来的时间:
对于 CentOS 7 及更早版本:
hwclock --systohc
或使用旧命令(向后兼容):
clock -w
对于较新系统:
hwclock -w
查看硬件时钟时间:
hwclock --show
或简写:
hwclock -r
date 命令的高级用法:
使用格式化字符串显示时间:
date 命令支持丰富的格式化选项,可以按需显示时间信息。
常用格式化字符:
时间相关:
- %H - 小时(00-23,24小时制)
- %I - 小时(01-12,12小时制)
- %M - 分钟(00-59)
- %S - 秒(00-59)
- %p - AM 或 PM
- %T - 时间(HH:MM:SS 格式)
- %r - 12小时制时间(hh:mm:ss AM/PM)
日期相关:
- %Y - 完整年份(如 2025)
- %y - 年份后两位(如 25)
- %m - 月份(01-12)
- %d - 日期(01-31)
- %D - 日期(mm/dd/yy 格式)
- %F - 日期(YYYY-MM-DD 格式,ISO 8601)
星期相关:
- %a - 星期简称(Mon、Tue 等)
- %A - 星期全称(Monday、Tuesday 等)
- %w - 星期数字(0-6,0代表星期日)
- %u - 星期数字(1-7,1代表星期一)
其他常用:
- %s - Unix 时间戳(从 1970-01-01 00:00:00 UTC 至今的秒数)
- %Z - 时区缩写(如 CST、UTC)
- %z - 时区偏移量(如 +0800)
- %c - 完整的日期和时间
- %x - 日期(根据本地化设置)
- %X - 时间(根据本地化设置)
格式化显示示例:
显示完整的日期时间信息:
date '+当前日期:%Y年%m月%d日,时间:%H:%M:%S,星期%A'
输出示例:
当前日期:2025年12月18日,时间:10:30:45,星期Wednesday
显示 ISO 8601 格式:
date '+%Y-%m-%dT%H:%M:%S%z'
输出示例:
2025-12-18T10:30:45+0800
显示 Unix 时间戳:
date '+%s'
输出示例:
1734490245
根据时间戳转换为可读日期:
date -d @1734490245
输出示例:
Wed Dec 18 10:30:45 CST 2025
相对时间设置:
date 命令支持相对时间设置,这在脚本编程中非常有用。
设置为明天此时:
date -s "tomorrow"
设置为昨天此时:
date -s "yesterday"
设置为 3 天后:
date -s "+3 days"
设置为 2 小时前:
date -s "-2 hours"
组合使用:
date -s "2025-12-25 +2 hours"
方法二:使用 timedatectl 命令(现代方法,推荐)
对于使用 systemd 的现代 Linux 系统(CentOS 7+、Ubuntu 16.04+、Debian 8+ 等),推荐使用 timedatectl 命令,它提供了更加统一和便捷的时间管理方式。
这个方法特别适合管理日本独立服务器或韩国VPS等需要精确时间配置的环境。
查看当前时间和时区信息:
timedatectl
或完整命令:
timedatectl status
输出示例:
Local time: Wed 2025-12-18 10:30:45 CST
Universal time: Wed 2025-12-18 02:30:45 UTC
RTC time: Wed 2025-12-18 02:30:45
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes NTP service: active RTC in local TZ: no
设置日期和时间:
timedatectl set-time "2025-12-25 10:30:00"
或分开设置:
timedatectl set-time "2025-12-25" timedatectl set-time "10:30:00"
注意: 如果启用了 NTP 时间同步,需要先禁用才能手动设置时间:
timedatectl set-ntp false
设置完成后可以重新启用:
timedatectl set-ntp true
列出所有可用时区:
timedatectl list-timezones
或配合 grep 查找特定地区:
timedatectl list-timezones | grep Asia
输出常见亚洲时区:
Asia/Shanghai (中国标准时间,UTC+8) Asia/Hong_Kong (香港时间,UTC+8) Asia/Tokyo (日本标准时间,UTC+9) Asia/Seoul (韩国标准时间,UTC+9) Asia/Singapore (新加坡时间,UTC+8) Asia/Taipei (台北时间,UTC+8) Asia/Bangkok (曼谷时间,UTC+7) Asia/Kuala_Lumpur (吉隆坡时间,UTC+8)
设置时区:
设置为中国标准时间(上海):
timedatectl set-timezone Asia/Shanghai
设置为香港时间:
timedatectl set-timezone Asia/Hong_Kong
设置为东京时间:
timedatectl set-timezone Asia/Tokyo
设置为新加坡时间:
timedatectl set-timezone Asia/Singapore
设置为 UTC 时间:
timedatectl set-timezone UTC
查看硬件时钟设置:
timedatectl 会显示 RTC(实时时钟)是使用本地时间还是 UTC 时间。通常建议设置为 UTC。
设置硬件时钟为 UTC:
timedatectl set-local-rtc 0
设置硬件时钟为本地时间:
timedatectl set-local-rtc 1
方法三:传统时区配置方法(兼容旧系统)
对于不支持 timedatectl 的旧系统(CentOS 6、RHEL 6 等),需要使用传统方法配置时区。
修改时区文件:
步骤 1:备份当前时区配置
cp /etc/localtime /etc/localtime.backup
步骤 2:查找目标时区文件
时区文件位于 /usr/share/zoneinfo/ 目录下,按地区和城市组织。
查看可用时区:
ls /usr/share/zoneinfo/Asia/
常见时区文件:
/usr/share/zoneinfo/Asia/Shanghai (中国) /usr/share/zoneinfo/Asia/Hong_Kong (香港) /usr/share/zoneinfo/Asia/Tokyo (日本) /usr/share/zoneinfo/Asia/Seoul (韩国) /usr/share/zoneinfo/Asia/Singapore (新加坡) /usr/share/zoneinfo/Asia/Taipei (台湾)
步骤 3:创建符号链接或复制文件
方法 A:创建符号链接(推荐)
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
方法 B:直接复制文件
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
步骤 4:修改时区配置文件(CentOS/RHEL)
编辑 /etc/sysconfig/clock 文件:
vim /etc/sysconfig/clock
修改内容为:
ZONE="Asia/Shanghai" UTC=false ARC=false
配置参数说明:
- ZONE - 时区标识符
- UTC - 硬件时钟是否使用 UTC 时间(false 表示使用本地时间)
- ARC - Alpha 架构特定参数,通常设为 false
保存并退出编辑器。
步骤 5:验证时区更改
date
查看输出中的时区标识是否正确(如 CST 表示中国标准时间)。
对于 Debian/Ubuntu 系统:
Debian 和 Ubuntu 系统使用不同的配置方法:
dpkg-reconfigure tzdata
这会启动一个交互式菜单,按照提示选择地理区域和城市即可。
或直接写入配置文件:
echo "Asia/Shanghai" > /etc/timezone ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
配置网络时间同步(NTP/Chrony,强烈推荐)
对于生产环境的服务器,特别是台湾独立服务器或马来西亚VPS等需要精确时间的场景,强烈建议配置自动时间同步,而不是手动设置时间。
使用 Chrony(CentOS 8+、RHEL 8+ 推荐):
Chrony 是 NTP 的现代替代品,性能更好,配置更简单。
安装 Chrony:
yum install chrony -y
或在 Debian/Ubuntu 上:
apt install chrony -y
启动并设置开机自启:
systemctl start chronyd systemctl enable chronyd
配置时间服务器:
编辑配置文件:
vim /etc/chrony.conf
修改或添加时间服务器(推荐使用国内或亚洲的 NTP 服务器):
注释掉默认服务器
#pool 2.centos.pool.ntp.org iburst
添加国内/亚洲 NTP 服务器
server ntp.aliyun.com iburst server ntp.tencent.com iburst server ntp1.aliyun.com iburst server cn.pool.ntp.org iburst server asia.pool.ntp.org iburst
针对不同地区的推荐 NTP 服务器:
中国大陆:
- ntp.aliyun.com
- ntp.tencent.com
- cn.pool.ntp.org
香港:
- ntp.hko.hk(香港天文台)
- hk.pool.ntp.org
日本:
- ntp.nict.jp(日本国立信息通信技术研究所)
- jp.pool.ntp.org
新加坡:
- sg.pool.ntp.org
韩国:
- kr.pool.ntp.org
全球通用:
- pool.ntp.org
- time.google.com
- time.cloudflare.com
保存配置后重启服务:
systemctl restart chronyd
查看同步状态:
chronyc tracking
输出示例:
Reference ID : 5B7A51BB (ntp.aliyun.com) Stratum : 3 Ref time (UTC) : Wed Dec 18 02:30:45 2025 System time : 0.000012345 seconds fast of NTP time Last offset : +0.000023456 seconds RMS offset : 0.000034567 seconds Frequency : 1.234 ppm slow Residual freq : +0.001 ppm Skew : 0.123 ppm Root delay : 0.012345678 seconds Root dispersion : 0.001234567 seconds Update interval : 64.5 seconds Leap status : Normal
查看时间源列表:
chronyc sources -v
强制立即同步:
chronyc makestep
使用 NTP(CentOS 7 及更早版本):
安装 NTP:
yum install ntp -y
启动并设置开机自启:
systemctl start ntpd systemctl enable ntpd
或在旧系统上:
service ntpd start chkconfig ntpd on
配置 NTP 服务器:
编辑配置文件:
vim /etc/ntp.conf
添加或修改服务器列表:
server ntp.aliyun.com iburst server ntp.tencent.com iburst server cn.pool.ntp.org iburst server asia.pool.ntp.org iburst
重启服务:
systemctl restart ntpd
查看同步状态:
ntpq -p
手动同步时间(仅用于初始化):
如果时间偏差过大,NTP 可能拒绝同步,可以先手动同步:
ntpdate ntp.aliyun.com
然后再启动 NTP 服务。
使用 systemd-timesyncd(Ubuntu/Debian):
Ubuntu 和较新的 Debian 系统默认使用 systemd-timesyncd。
检查状态:
timedatectl timesync-status
配置时间服务器:
编辑配置文件:
vim /etc/systemd/timesyncd.conf
修改内容:
[Time] NTP=ntp.aliyun.com ntp.tencent.com FallbackNTP=cn.pool.ntp.org asia.pool.ntp.org
重启服务:
systemctl restart systemd-timesyncd
启用时间同步:
timedatectl set-ntp true
实用时间管理脚本:
一键设置时间脚本:
创建一个便捷的时间设置脚本:
vim /usr/local/bin/settime.sh
输入以下内容:
#!/bin/bash
快速设置系统时间脚本
if [ $# -ne 2 ]; then echo "用法: $0 日期 时间" echo "示例: $0 2025-12-25 10:30:00" exit 1 fi
date -s "$1 $2" hwclock --systohc echo "时间已设置为: $(date)"
保存并添加执行权限:
chmod +x /usr/local/bin/settime.sh
使用示例:
settime.sh 2025-12-25 10:30:00
时间检查脚本:
创建一个时间检查和报告脚本:
vim /usr/local/bin/timecheck.sh
输入以下内容:
#!/bin/bash
系统时间检查脚本
echo "========== 系统时间信息 ==========" echo "系统时间: $(date)" echo "硬件时间: $(hwclock -r)" echo "" echo "时区信息:" timedatectl status 2>/dev/null || cat /etc/timezone 2>/dev/null || echo "无法获取时区信息" echo "" echo "时间同步状态:" if systemctl is-active --quiet chronyd; then echo "Chrony 服务: 运行中" chronyc tracking 2>/dev/null elif systemctl is-active --quiet ntpd; then echo "NTP 服务: 运行中" ntpq -p 2>/dev/null elif systemctl is-active --quiet systemd-timesyncd; then echo "systemd-timesyncd 服务: 运行中" timedatectl timesync-status 2>/dev/null else echo "警告: 未检测到时间同步服务" fi
保存并添加执行权限:
chmod +x /usr/local/bin/timecheck.sh
运行检查:
timecheck.sh
常见问题排查:
问题 1:修改时间后重启又恢复了
- 原因: 未将系统时间同步到硬件时钟
- 解决: 执行 hwclock --systohc 或 clock -w 命令
问题 2:时间总是相差 8 小时
- 原因: 时区设置错误或硬件时钟使用了 UTC 时间
- 解决: 检查时区设置,确保使用正确的本地时区;或调整硬件时钟设置
问题 3:无法使用 timedatectl 命令
- 原因: 系统版本过旧,不支持 systemd
- 解决: 使用传统的 date 和时区配置方法
问题 4:NTP 同步失败
- 原因: 防火墙阻止 NTP 端口(UDP 123)或网络不通
- 解决: 开放防火墙端口,测试与 NTP 服务器的连接
问题 5:时间漂移严重
- 原因: 硬件时钟不准确或未启用时间同步
- 解决: 配置 NTP/Chrony 自动同步,检查硬件健康状况
问题 6:虚拟机时间不准
- 原因: 虚拟机时间同步与宿主机冲突
- 解决: 在虚拟机中禁用与宿主机的时间同步,使用 NTP 独立同步
问题 7:Docker 容器时间不正确
- 原因: 容器继承宿主机的时区设置
- 解决: 在容器中挂载宿主机的时区文件,或使用环境变量设置时区
安全和最佳实践:
生产环境建议:
- 使用 NTP 自动同步: 不要手动设置时间,配置可靠的 NTP 服务器
- 选择近距离的 NTP 服务器: 优先使用地理位置接近的时间服务器,减少网络延迟
- 配置多个时间源: 至少配置 3-4 个 NTP 服务器,提高可靠性
- 监控时间偏移: 定期检查系统时间偏移量,及时发现问题
- 统一时区设置: 集群内所有服务器使用相同的时区(建议 UTC)
- 记录时间变更: 在审计日志中记录所有时间修改操作
- 测试时间变更影响: 在变更前评估对数据库、日志、证书等服务的影响
防火墙配置:
如果启用了防火墙,需要开放 NTP 端口:
对于 firewalld(CentOS 7+):
firewall-cmd --permanent --add-service=ntp firewall-cmd --reload
对于 iptables:
iptables -A INPUT -p udp --dport 123 -j ACCEPT iptables -A OUTPUT -p udp --sport 123 -j ACCEPT service iptables save
时区选择建议:
- 数据库服务器: 建议使用 UTC,便于全球化应用
- Web 服务器: 根据主要用户群体选择时区
- 日志服务器: 建议使用 UTC,便于跨时区分析
- 应用服务器: 根据业务需求选择,但集群内应保持一致
通过以上方法,您可以灵活地在 Linux 系统上管理时间设置。对于生产环境,强烈推荐使用 NTP/Chrony 自动同步时间,确保系统时间的准确性和可靠性。