本文详细介绍如何在 Linux 系统上修改日期、时间和时区,适用于 CentOS、RHEL、Ubuntu、Debian、Rocky Linux、AlmaLinux 等主流发行版。

应用场景:

系统时间配置在以下场景中至关重要:

  • 服务器部署和初始化配置
  • 跨时区业务系统部署
  • 日志记录和审计要求
  • 证书和加密服务依赖准确时间
  • 分布式系统时间同步

无论您使用的是香港独立服务器新加坡VPS还是其他地区的服务器,正确配置系统时间都是系统管理的基础工作。


准备工作:

在开始修改系统时间之前,请注意以下几点:

  1. 需要 root 权限: 所有时间修改操作都需要 root 或 sudo 权限
  2. 了解当前系统: 确认您使用的 Linux 发行版和版本
  3. 备份重要配置: 虽然修改时间不会影响数据,但建议备份时区配置文件
  4. 检查依赖服务: 某些服务对时间变化敏感,修改前请做好规划
  5. 考虑使用 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 容器时间不正确

  • 原因: 容器继承宿主机的时区设置
  • 解决: 在容器中挂载宿主机的时区文件,或使用环境变量设置时区

安全和最佳实践:

生产环境建议:

  1. 使用 NTP 自动同步: 不要手动设置时间,配置可靠的 NTP 服务器
  2. 选择近距离的 NTP 服务器: 优先使用地理位置接近的时间服务器,减少网络延迟
  3. 配置多个时间源: 至少配置 3-4 个 NTP 服务器,提高可靠性
  4. 监控时间偏移: 定期检查系统时间偏移量,及时发现问题
  5. 统一时区设置: 集群内所有服务器使用相同的时区(建议 UTC)
  6. 记录时间变更: 在审计日志中记录所有时间修改操作
  7. 测试时间变更影响: 在变更前评估对数据库、日志、证书等服务的影响

防火墙配置:

如果启用了防火墙,需要开放 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 自动同步时间,确保系统时间的准确性和可靠性。