在Linux系统中,有很多与时间相关的命令,这些命令可以帮助用户查看系统时间、设置系统时间、计划任务等。
命令 | 功能说明 |
---|---|
date | 显示或设置系统日期和时间 |
hwclock | 显示或设置硬件时钟(BIOS时间) |
ntpdate | 同步本地系统时间与远程NTP服务器上的时间 |
timedatectl | 查询或修改系统时钟和时区设置 |
【功能说明】
date命令用于显示当前的系统时间或设置系统时间。
【语法格式】
date [option] [+format]
date [选项] [+日期格式]
【选项说明】
参数选项 | 解释说明 |
---|---|
-s time | 将字符串所描述的时间设置成系统时间 |
-d string | 显示指定字符串所描述的时间,不是当前时间 |
-r file | 显示文件的最后修改时间 |
-u | 显示或设置UTC时间 |
日期格式 | 解释说明 | 日期格式 | 解释说明 |
---|---|---|---|
%A | 表示星期(全称,Sunday) | %a | 表示星期(缩写,Sun) |
%B | 表示月份(全称,January) | %b | 表示月份(缩写,Jan) |
%C | 表示世纪(完整年份去掉后两位) | %c | 显示日期和时间(Tue 18 Aug 2024 02:28:22 PM CST ) |
%D | 格式化显示日期(等价%m/%d/%y,08/23/24) | %d | 表示每月的第几天(01-31) |
%e | 表示每月的第几天(1-31) | ||
%F | 表示完整日期格式(等价%Y-%m-%d,2024-08-23) | ||
%G | 表示ISO周数年份(2024) | %g | 表示ISO周数年份的后两位(24) |
%H | 表示小时(24小时制,00-23) | %h | 表示月份(缩写,Jan) |
%I | 表示小时(12小时制,01-12) | ||
%j | 表示一年中的第几天(001-366) | ||
%k | 表示小时(24小时制,0-23) | ||
%l | 表示小时(12小时制,1-12) | ||
%M | 表示月份(01-12) | %m | 表示分钟(00-59) |
%N | 表示纳秒 | %n | 换行符 |
%P | 表示上午下午(am/pm) | %p | 表示上午下午(AM/PM) |
%R | 24小时制时分表示(等价%H:%M,14:30) | %r | 当下时区12小时制时间(02:23:27 PM) |
%S | 表示秒(01-60) | %s | 表示自1907-01-01 00:00:00 以来的秒数 |
%T | 表示时间(等价%H:%M:%S,14:30:50) | %t | 输出制表符Tab |
%U | 表示一年中的第几周,以周日为周的第一天(00-53) | %u | 表示星期(1-7) |
%V | 表示表示ISO周数,以周一为周的第一天(01-53) | ||
%W | 表示一年中的第几周,以周一为周的第一天(01-53) | %w | 表示一星期中的第几天(0-6,0表示周一) |
%X | 表示时间(14:23:27 PM) | %x | 表示日期(08/24/2024) |
%Y | 表示年份(2024) | %y | 表示年份后两位(00-99) |
%Z | 表示字母格式时区(CST) | %z | 表示时区(+0800) |
【使用范例】
# 显示一个完成的时间值(年月日时分秒)
[root@localhost ~]# date +%F%t%T
2024-08-23 11:00:19
[root@localhost ~]# date +%F%n%T
2024-08-23
12:25:44
[root@localhost ~]# date +"%Y-%m-%d %H:%M:%S"
2024-08-23 12:40:44
# 设置日期,具体时间为空的话,表示00:00:00
[root@localhost ~]# date -s 20231013
Fri Oct 13 00:00:00 CST 2023
# 单独对时间进行修改
[root@localhost ~]# date -s 12:25:27
Fri Oct 13 12:25:27 CST 2023
# 设置完整的时间的话
[root@localhost ~]# date -s "14:30:32 20231013"
Fri Oct 13 14:30:32 CST 2023
# 日期可以使用一些其他格式表示
[root@localhost ~]# date -s "14:30:32 2023/10/13"
Fri Oct 13 14:30:32 CST 2023
[root@localhost ~]# date -s "14:30:32 2023-10-13"
Fri Oct 13 14:30:32 CST 2023
# 当前时间
[root@localhost ~]# date +%F
2024-08-23
# 显示昨天
[root@localhost ~]# date +%F -d "-1day"
2024-08-22
[root@localhost ~]# date +%F -d "yesterday"
2024-08-22
# 显示明天
[root@localhost ~]# date +%F -d "+1day"
2024-08-24
[root@localhost ~]# date +%F -d "tomorrow"
2024-08-24
# 上个月
[root@localhost ~]# date +%F -d "-1month"
2024-07-23
# 明年
[root@localhost ~]# date +%F -d "+year"
2025-08-23
这里的+号表示未来,-号表示过去,day表示日,year表示年,month表示月,hour表示小时,min表示分。
不加数字的话,+号和-号不起作用,表示+1。
-d
选项后面接上需要转化的时间,最后再接上想要输出的时间格式。
[root@localhost ~]# date -d "Thu Jul 6 21:41:16 CST 2021" "+%Y-%m-%d %H:%M:%S"
2021-07-06 21:41:16
【功能说明】
hwclock命令用于查看和设置系统的硬件时钟(RTC,实时时钟)。
【语法格式】
hwclock [function] [option]
hwclock [功能] [选项]
【选项说明】
功能选项 | 解释说明 |
---|---|
-r,–show | 读取硬件时钟并在标准输出上打印时间 |
–set | 将硬件时钟设置为--date 选项给出的时间 |
-s,–hctosys | 将系统时间设置为硬件时间 |
-w,–systohc | 将硬件时钟设置为当前系统时间 |
–systz | 设置内核的时区,并根据当前时区重置系统时间 |
–adjust | 从硬件时钟中添加或减去时间,以考虑自上次以来的系统漂移 |
–predict | 预测在--date 选项指定的时间点硬件时钟将会显示的时间 |
-c,–compare | 定期(每10s)比较硬件时钟与系统时间,并输出两者之间的差异 |
-V, --version | 显示版本信息并退出 |
-h, --help | 显示帮助内容并退出 |
-c,–compare | 定期(每10s)比较硬件时钟与系统时间,并输出两者之间的差异 |
硬件时钟可能会因为温度、电压等因素而产生一些误差,这就是系统漂移。要调整硬件时钟以考虑系统漂移。
--adjust
会根据/etc/adjtime
文件中的信息来调整硬件时钟的时间。可以使用--debug
选项来查看调整的过程和结果。
参数选项 | 解释说明 |
---|---|
–date | 设置硬件时钟时间 |
-u,–utc | 将硬件时钟保持为UTC |
–localtime | 将硬件时钟保持为本地时间 |
–debug | 显示hwclock内部操作的信息 |
–test | 执行操作,但不实际更新硬件时钟或执行任何其他更改 |
【使用范例】
[root@localhost ~]# hwclock -r
Fri 23 Aug 2024 03:28:35 PM CST -0.241630 seconds
[root@localhost ~]# hwclock --show
Fri 23 Aug 2024 03:28:17 PM CST -0.991175 seconds
hwclock --set --date="2024-04-19 10:30"
# 设置时间
[root@localhost ~]# hwclock --set --date="2024-04-19 10:30"
[root@localhost ~]# hwclock --show
Fri 19 Apr 2024 10:30:07 AM CST -0.242982 seconds
# 这里不进行实际修改,所以使用--test进行测试设置
[root@localhost ~]# hwclock --set --date="2024-04-19 10:30" --test
Clock not changed - testing only.
Not updating adjtime file because of testing mode.
Would have written the following to /etc/adjtime:
0.000000 1713493800 0.000000
1713493800
UTC
# 从硬件时钟设置系统时间
[root@localhost ~]# hwclock -s
或
[root@localhost ~]# hwclock --hctosys
# 举例
[root@localhost ~]# date
Fri Aug 23 15:41:34 CST 2024 # 当前系统时间2024-08-23……
[root@localhost ~]# hwclock --show # 当前硬件时间2024-04-19……
Fri 19 Apr 2024 10:32:48 AM CST -0.181154 seconds
[root@localhost ~]# hwclock -s # 同步
[root@localhost ~]# date
Fri Apr 19 10:33:15 CST 2024 # 系统时间2024-04-19……
# 从系统时间设置硬件时钟
[root@localhost ~]# hwclock -w
或
[root@localhost ~]# hwclock --systohoc
# 举例
[root@localhost ~]# date
Fri Aug 23 15:56:12 CST 2024 # 当前系统时间2024-08-23……
[root@localhost ~]# hwclock -r # 当前硬件时间2024-04-19……
Fri 19 Apr 2024 10:48:16 AM CST -0.974484 seconds
[root@localhost ~]# hwclock -w # 同步
[root@localhost ~]# hwclock -r
Fri 23 Aug 2024 03:57:45 PM CST -0.365402 seconds # 当前硬件时间2024-08-23……
[root@localhost ~]# hwclock -u
Fri 23 Aug 2024 04:03:02 PM CST -0.365687 seconds
[root@localhost ~]# hwclock --utc
Fri 23 Aug 2024 04:03:22 PM CST -0.289378 seconds
[root@localhost ~]# hwclock --localtime
Fri 23 Aug 2024 08:05:00 AM CST -0.476047 seconds
[root@localhost ~]# hwclock --adjust
# 使用--debug选项来查看调整的过程和结果
[root@localhost ~]# hwclock --adjust --debug
hwclock from util-linux 2.23.2 # 版本
Using /dev interface to clock. # 使用了/dev接口来与硬件时钟通信
Last drift adjustment done at 1724399860 seconds after 1969
Last calibration done at 1724399860 seconds after 1969 # 最后漂移调整和校准都是在1969年后1724399860秒时进行的
Hardware clock is on UTC time # 硬件时钟被设定为UTC时间
Assuming hardware clock is kept in UTC time. # 硬件时钟保持UTC时间
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 2024/08/23 08:18:54 # 从硬件时钟读取到的时间是2024年08月23日 08:18:54
Hw clock time : 2024/08/23 08:18:54 = 1724401134 seconds since 1969
Time since last adjustment is 1274 seconds
Need to insert 0 seconds and refer time back 0.000000 seconds ago
Needed adjustment is less than one second, so not setting clock.
# hwclock计算出需要插入0秒,并将参考时间回溯0.000000秒,这意味着硬件时钟与系统时间之间差异非常小,以至于不需要进行调整。
# 因此,因为所需的调整时间少于一秒,hwclock决定不修改硬件时钟的时间。
ntpdate命令用于手动、一次性地同步计算机的系统时间与互联网上NTP服务器的时间。
适用于需要快速纠正时间偏差的情况,但不适用于需要持续、自动维护时间同步的应用场景。
常见的网络授时NTP地址
- pool.ntp.org:这是一个在全球分布的NTP服务器池,会根据你的地理位置自动选择最近的服务器。
- time.nist.gov:来自美国国家标准与技术研究院(NIST)的时间服务器。
- time.windows.com:微软提供的公共NTP服务器。
- time.google.com:谷歌提供的NTP服务。
- ntp.aliyun.com:阿里云提供的NTP服务器。
- cn.ntp.org.cn:中国国家授时中心的NTP服务器。
[root@localhost ~]# ntpdate pool.ntp.org
23 Aug 16:34:05 ntpdate[1860]: adjust time server 203.107.6.88 offset 0.022699 sec
timedatectl是一个在Linux系统中管理时间和日期的命令行工具,是systemd的一部分,允许用户查看和修改系统的时区、日期、时间以及与NTP同步的状态等。需要root权限。因为相当一部分功能并不常用,这里仅对几个常用方法进行说明。
使用
timedatectl
的常见操作
- 查看系统时间状态:timedatectl、timedatectl status
- 查看所有可用时区:timedatectl list-timezones
- 设置时区:timedatectl set-timezone Asia/Shanghai
- 设置硬件时钟为本地时间:timedatectl set-local-rtc 1
- 设置硬件时钟为UTC时间:timedatectl set-local-rtc 0
【使用范例】
[root@localhost ~]# timedatectl
Local time: Fri 2024-08-23 16:57:49 CST
Universal time: Fri 2024-08-23 08:57:49 UTC
RTC time: Fri 2024-08-23 08:57:49
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@localhost ~]# timedatectl status
Local time: Fri 2024-08-23 08:58:28 UTC
Universal time: Fri 2024-08-23 08:58:28 UTC
RTC time: Fri 2024-08-23 08:58:27
Time zone: UTC (UTC, +0000)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
timedatectl list-timezones
查看[root@localhost ~]# timedatectl set-timezone Asia/Shanghai
[root@localhost ~]# timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre
Africa/Brazzaville
Africa/Bujumbura
Africa/Cairo
......
在Linux系统中,有时需要进行主备连接,这样的连接可能涉及到数据信息的同步,如果同步的服务器之间时间不统一,可能会造成同步终端之间数据同步异常,所以保持系统时间的准确性是非常重要的,而且时间同步可以通过多种方式实现。
使用cron配合ntpdate来同步服务器时间是一种经典的方法,尤其适合那些不使用systemd的服务管理系统,或是需要以特定周期手动执行时间同步的场景。
# 安装ntpdate,一些系统里这个命令不是默认安装的
[root@localhost ~]# yum install ntpdate -y
# 手动执行命令同步时间
[root@localhost ~]# /usr/sbin/ntpdate ntp.aliyun.com
23 Aug 19:05:49 ntpdate[2211]: adjust time server 203.107.6.88 offset 0.000372 sec
# 编辑定时任务:每5分钟进行一次同步时间操作
# 配置文件里添加的内容:*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com >/dev/null 2>&1
# 说明:>/dev/null 2>&1的意思是将命令正常输出的内容丢掉,不会进行显示。
[root@localhost ~]# echo "*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com >/dev/null 2>&1" >>/var/spool/cron/root
任务:每5分钟进行一次同步时间操作
*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com
# 但是实际在定时任务配置文件/var/spool/cron/root里补充的内容是:
*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com >/dev/null 2>&1
# >/dev/null 2>&1的作用是将命令输出的内容丢掉,不会显示出来。
实际操作命令:
# 插入定时任务
[root@localhost ~]# echo "*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com >/dev/null 2>&1" >>/var/spool/cron/root
# 检查文件内容
[root@localhost ~]# crontab -l
*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com >/dev/null 2>&1
ntpd是用于同步计算机时钟的网络时间协议的服务,是一个守护进程,能够确保系统时间与互联网上时间服务器的时间保持一致,从而保证系统时间的准确性。
[root@localhost ~]# which ntpd
/usr/sbin/ntpd
# 如果没有安装的话则需要进行安装
[root@localhost ~]# yum install ntp
NTP的配置文件通常位于/etc/ntp.conf
。默认情况下,NTP会使用一组预设的公共时间服务器进行同步,但你也可以根据需要添加或更改这些服务器。建议将里面的时间服务器换成国内的,编辑ntp.conf
文件,添加或修改类似于以下的行,可以添加多个。
server ntp.aliyun.com iburst # ntp.aliyun.com就是时间服务器地址
安装并配置好之后,需要启动NTP服务,并设置为开机启动,以确保时间同步在系统重启后仍然有效。
[root@localhost ~]# systemctl start ntpd
[root@localhost ~]# systemctl enable ntpd
简单查看系统当前时间与NTP同步情况:
[root@localhost ~]# timedatectl status
Local time: Sat 2024-08-24 09:07:49 CST
Universal time: Sat 2024-08-24 01:07:49 UTC
RTC time: Sat 2024-08-24 01:07:48
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes # 服务启用
NTP synchronized: yes # 时间同步启用
RTC in local TZ: no
DST active: n/a
或者,使用ntpq工具查看(需要安装ntp-utils包):
# 显示与系统同步的NTP服务器列表及其状态
[root@localhost ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*213.117.8.89 100.107.25.114 2 u 21 64 17 10.202 14.948 2.949
Chrony 是一个时间同步服务软件,它主要用于 Linux 系统中精确地同步系统时钟与外部时间源,如原子钟或者公共 NTP 服务器。可以提供比传统的 ntp 更高的精度和更快的收敛速度。
首先,确保你的系统中已经安装了 chrony。如果没有安装,可以通过包管理器进行安装。
# 检查是否安装
[root@localhost ~]# rpm -qa chrony
chrony-3.4-1.el7.x86_64
# 安装
[root@localhost ~]# yum install chrony -y
/etc/chrony.conf
来添加时间服务器或者调整其他设置,与Ntpd方式类似。server ntp.aliyun.com iburst # ntp.aliyun.com就是时间服务器地址
安装并配置好之后,需要启动Chrony服务,并设置为开机启动,以确保时间同步在系统重启后仍然有效。
[root@localhost ~]# systemctl start chronyd
[root@localhost ~]# systemctl enable chronyd
要检查系统时间是否已经同步,可以运行:
[root@localhost ~]# chronyc sources
210 Number of sources = 2
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? 120.25.115.20 2 7 54 195 -1706us[-1526us] +/- 26ms
^* 203.107.6.88 2 6 177 7 +10us[ -128us] +/- 17ms
[root@localhost ~]# timedatectl status
Local time: Sat 2024-08-24 10:03:44 CST
Universal time: Sat 2024-08-24 02:03:44 UTC
RTC time: Sat 2024-08-24 02:03:44
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
这两个命令都会显示当前的时钟源和系统时间状态。
通常,Chrony 会自动与时间服务器同步。但如果你想立即手动同步时间,可以执行以下命令:
[root@localhost ~]# chronyc sources -v 210 Number of sources = 2 .-- Source mode '^' = server, '=' = peer, '#' = local clock. / .- Source state '*' = current synced, '+' = combined , '-' = not combined, | / '?' = unreachable, 'x' = time may be in error, '~' = time too variable. || .- xxxx [ yyyy ] +/- zzzz || Reachability register (octal) -. | xxxx = adjusted offset, || Log2(Polling interval) --. | | yyyy = measured offset, || \ | | zzzz = estimated error. || | | \ MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^? 120.25.115.20 2 7 54 282 -1232us[-1526us] +/- 26ms ^* 203.107.6.88 2 6 377 30 -2651us[-4823us] +/- 16ms
这个命令会显示当前使用的时钟源和它们的状态。
如果你想要强制立即同步,可以执行:
[root@localhost ~]# chronyc makestep 200 OK
Systemd-timesyncd 是 systemd 的一部分,是一个轻量级的时间同步服务,主要设计用于取代传统的 NTP 客户端,适用于那些只需要基本时间同步功能而不需要全部 NTP 功能的系统。
首先,检查 systemd-timesyncd 服务是否已经启用并运行。如果没有安装,可以通过包管理器进行安装。
# 检查是否启用
[root@localhost ~]# systemctl status systemd-timesyncd
○ systemd-timesyncd.service - Network Time Synchronization
Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; disabled; preset: disabled)
Active: inactive (dead)
Docs: man:systemd-timesyncd.service(8)
# 安装
[root@localhost ~]# dnf install systemd-timesyncd -y
# 启动服务
[root@localhost ~]# systemctl start systemd-timesyncd
# 设置开机自启
[root@localhost ~]# systemctl enable systemd-timesyncd
这个服务在CentOS7中没有找到,安装包里也没有找到。应该是在一些新版本里才能使用。
默认情况下,systemd-timesyncd 会自动选择合适的 NTP 服务器进行时间同步,可以编辑 /etc/systemd/timesyncd.conf
文件来指定 NTP 服务器或其他设置。
要更改同步服务器,可以在 [Time] 区块添加或修改 NTP= 行,如下所示:
[Time]
NTP=ntp.aliyun.com iburst # ntp.aliyun.com就是时间服务器地址
保存更改后,重启 systemd-timesyncd 服务使更改生效。
查看 systemd-timesyncd 的同步状态:
[root@localhost ~]# timedatectl status
Local time: Sat 2024-08-24 09:07:49 CST
Universal time: Sat 2024-08-24 01:07:49 UTC
RTC time: Sat 2024-08-24 01:07:48
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes # 服务启用
NTP synchronized: yes # 时间同步启用
RTC in local TZ: no
DST active: n/a
systemd-timesyncd 主要关注于保持系统时钟与网络时间的近似同步,对于需要高度精确时间同步的应用(如金融交易系统、分布式计算等),建议使用更专业的 NTP 客户端如 chrony 或 ntp。
cron + ntpdate
方式是一种较传统的方法,通过cron定时任务定期执行ntpdate命令来同步系统时间。ntpdate一次性地从NTP服务器获取时间并设置系统时间,不会持续调整时间。
ntpd
方式是NTP协议的经典实现,能够提供高度精确的时间同步。它不仅可以同步时间,还能作为服务器参与整个NTP网络的时间同步。
chrony
方式是一个替代ntpd的服务,专注于快速和高精度的时间同步,尤其在系统启动或网络条件变化时能迅速校准时间。也支持NTP和PTP协议。
Systemd-timesyncd
是systemd的一部分,设计为轻量级且低资源占用的时间同步服务,适用于客户端系统。它定期与NTP服务器通信,逐步调整系统时间以减少突跳。
所以,对于上述比较提出以下建议供参考。
- 对于大多数桌面系统和对时间精度要求不极端的应用,Systemd-timesyncd因其实现简单、资源消耗低而成为优选。
- 对于服务器或需要高度精确时间同步的环境,chrony因其快速同步和高精度特性而更受欢迎。
- ntpd适合那些需要高级功能和完全控制NTP配置的高级用户或专业环境。
- cron + ntpdate则更多作为临时或简易解决方案在一些特定场景下使用。