CentOS 7 设置时间和日期

CentOS 7 有两种类型的时间:

  • 实时时间(Real-Time Clock,RTC),通常称为硬件时间,完全独立于操作系统运行,一般是由主板上的COMS负责维护,因此在操作系统关闭后也能运行。
  • 系统时间(System Time),也称为软件时间,由Linux内核维护,其初始值基于硬件时间,一旦Linux启动并且系统时间被初始化,系统时间就完全独立于硬件时间。

CentOS 7 提供了三个命令行工具,可以用来显示和配置时间:timedatectl,date,hwclock;timedatectl是CentOS 7的新工具,可以同时管理系统时间和硬件时间,date是CentOS 6就有的工具,只能管理系统时间,一般是脚本中用于格式化输出时间,hwclock主要用于管理硬件时间。

使用timedatectl命令

CentOS 7 中以ctl结尾的命令,几乎都是systemd的一部分,timedatectl也不例外。

显示当前日期和时间

[root@localhost ~]# timedatectl 
      Local time: Fri 2018-07-20 17:46:09 CST
  Universal time: Fri 2018-07-20 09:46:09 UTC
        RTC time: Fri 2018-07-20 09:46:09
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
[root@localhost ~]# timedatectl 
      Local time: 本地时间,与系统设置的时区有关系,北京时间简写CST
  Universal time: 协调世界时,简写为UTC
        RTC time: 硬件时间,默认显示时间是UTC时间
       Time zone: 当前时区
     NTP enabled: 是否设置NTP服务开机启动
NTP synchronized: NTP服务是否已经同步时间
 RTC in local TZ: 硬件时间是否是本地时区
      DST active: 夏令时是否可用 n/a(Not applicable,不可用)

这里的NTP服务由chronyd或者ntpd提供,具体取决于安装的是哪个服务,手动改变chronydntpd的状态(systemctl enable|disable设置是否开机启动,是否同步时间),不会立即同步给timedatectl。如果更改了这些它们的设置或状态,请输入以下命令立即获取它们的状态:

[root@localhost ~]# systemctl restart systemd-timedated.service 

修改本地时间

[root@localhost ~]# timedatectl set-time 12:12:12  //修改为12:12:12

该命令同时修改系统时间和硬件时钟,其结果类似于同时使用date -set(设置系统时间)加上hwclock -systohc(将系统时间写入硬件时间,-systohc同-w)命令,如果timedatectl set-time出现以下提示

Failed to set time: Automatic time synchronization is enabled

是因为启用了NTP

[root@localhost ~]# timedatectl 
      Local time: Fri 2018-07-20 17:46:09 CST
  Universal time: Fri 2018-07-20 09:46:09 UTC
        RTC time: Fri 2018-07-20 09:46:09
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

既然已经设置了NTP服务,也没手动设置时间的必要了,强制立即同步时间

[root@CentOS_7_4 ~]# chronyc makestep  //适用与chronyc做NTP服务,实际测试未成功,原因未知

  [root@CentOS_7_4 ~]# ntpdate 210.72.145.44  //chronyc和ntpd做ntp服务都可以使用该命令

如果确实有手动设置时间的需求,timedatectl手动关闭NTP服务,或者使用date -s

[root@localhost ~]# timedatectl set-ntp false   //禁用NTP

默认情况下,系统配置硬件时间使用UTC,使硬件时间使用本地时间,请使用以下命令

[root@localhost ~]# timedatectl set-local-rtc boolean

若要配置系统以在本地时间保持时钟,请用“yes”(或者y,true,t,1)替换boolean,若要配置系统使用UTC,请用NO(或者n,false,f,0)替换boolean,默认值为no

修改本地日期

[root@localhost ~]# timedatectl set-time 2011-12-01  //设置日期为2011年12月1日

请注意,只更改日期而不指定时间将会导致时间设置为00:00:00,设置完整时间格式如下

[root@localhost ~]# timedatectl set-time "2022-10-10 11:11:11"

设置时区

列出所有时区

[root@localhost ~]# timedatectl list-timezones 

设置时区为 亚洲/上海

[root@localhost ~]# timedatectl set-timezone Asia/Shanghai 

查找亚洲时区

[root@localhost ~]# timedatectl list-timezones |grep Asia

设置时间同步

timedatectl命令还允许您使用NTP协议,启用与远程服务器的系统时钟自动同步;启用NTP将启用chronydntpd服务,具体取决于安装的是哪个。

[root@localhost ~]# timedatectl set-ntp boolean

请用“yes”(或者y,true,t,1)替换boolean,若要禁用,请用NO(或者n,false,f,0)替换boolean

如果NTP未安装服务,该命令将失败

使用date命令设置时间

date实用程序适用于所有Linux系统,并允许您显示和配置当前日期和时间,在脚本中经常使用它以自定义格式显示有关系统时钟的详细信息。与timedatectl不同的是date命令只设置系统时间,而不设置硬件时间(RTC)

[root@localhost ~]# date
Mon Jul 23 11:47:04 CST 2018

默认情况下,date命令显示本地时间,若要以UTC显示时间,请使用--utc-u命令行选项运行命令

[root@localhost ~]# date -u
Mon Jul 23 03:48:21 UTC 2018

可以通过在命令行上提供选项来自定义显示信息的格式

[root@localhost ~]# date +"%Y-%m-%d %H:%M"
2018-07-23 11:53

常用控制项见下表

控制序列

描述

%H

HH格式的小时(例如17

%M

MM格式的分钟(例如30

%S

SS格式的第二个(例如24

%d

DD格式的月份日期(例如16

%m

MM格式的月份(例如09

%Y

YYYY格式的年份(例如2016

%Z

时区缩写(例如CEST

%F

YYYY-MM-DD格式的完整日期(例如2016-09-16)。此选项等于%Y-%m-%d

%T

HH:MM:SS格式的完整时间(例如,17 :30: 24)。此选项等于%H:%M:%S

设置本地时间

设置本地时间为20:20:20

[root@localhost ~]# date -s 20:20:20
Mon Jul 23 20:20:20 CST 2018

设置时间为 utc 时间 20:20:20

[root@localhost ~]# date -s "12:00:00" -u
Fri Sep  7 12:00:00 UTC 2018
[root@localhost ~]# date
Fri Sep  7 20:00:02 CST 2018

UTC时间比CST快8个小时 ,也就是说设置时间为UTC 12:00:00等同于设置时间为CST 20:00:00

设置本地日期

[root@localhost ~]# date -s 2012-12-12 
Wed Dec 12 00:00:00 CST 2012

设置完整日期

[root@localhost ~]# date -s "2012-12-12 12:12:12"
Wed Dec 12 12:12:12 CST 2012

使用hwclock命令

hwclock是用于访问硬件时钟的实用程序,硬件时钟存储的值为:年、月、日、小时、分钟和秒。不能存储时间标准、本地时间或协调世界时(UTC),也不能设置夏令时(DST)。hwclock实用程序将其设置保存在/etc/adjtime文件中,该文件是使用您所做的第一个更改创建的,例如,当您手动设置时间或将硬件时钟与系统时间同步时。

在Red Hat Enterprise Linux 6中,hwclock命令在每次系统关闭或重新启动时自动运行,但它不在Red Hat Enterprise Linux 7中。当系统时钟通过网络时间协议(NTP)或精确时间协议(PTP)同步时),内核每11分钟自动将硬件时钟与系统时钟同步。

显示当前硬件时间

[root@localhost ~]# hwclock 
Wed 12 Dec 2012 12:07:24 AM CST  -0.672664 seconds

设置硬件时间

如果要将日期和时间设置为特定值(例如,“2016年10月21日21:17”),请root按以下格式运行命令

[root@localhost ~]# hwclock --set --date "21 Oct 2016 21:17"

以UTC时间 hwclock --set --date "21 Oct 2016 21:17" 设置硬件时间

[root@localhost ~]# hwclock --set --date "21 Oct 2016 21:17" -u

我在实际验证中,这里的 -u参数并没有起到作用

同步时间和日期

  • 设置硬件时间为系统时间
[root@localhost ~]# hwclock -w
  • 设置系统时间为硬件时间
[root@localhost ~]# hwclock -s

关于CentOS时间的杂谈

系统时间原理

系统时间由Linux内核维护,其初始值基于硬件时间,一旦Linux启动并且系统时间被初始化,系统时钟就完全独立于硬件时间。这也是为什么date修改系统时间后要hwclock -w,将系统时间同步给硬件时间,如果不同步,重启操作系统,系统时间将再次基于硬件时间初始化,这也就失去了修改系统时间的意义。timedatectl set-time 是同时设置系统时间和硬件时间。

要验证这个原理也非常简单,在Linux关机后,进入BIOS修改硬件时间,再开机查看Linux的系统时间,不出意外此时系统时间应会出现相应变化,做这个测试建议把杂谈看完后再做,不然会有一些困惑

系统时间误差

Linux内核初始化系统时间后,只要不关机或做特殊设置,Linux的系统时间就一直由Linux内核维护,也正是因为这个原因Linux运行久了,会出现系统时间和硬件时间偏差(一个是靠Linux内核维护,一个是靠硬件维护),一般是几秒钟左右。因此需要设置定时任务,将硬件时间同步至系统时间,避免系统重启后,系统时间出现偏差。

对于一些集群而言,则需要设置NTP时间同步,保证系统时间的准确性,详细的设置NTP时间同步后续文章再写。 

本地时间

系统时间、硬件时间始终是协调世界时(UTC),Linux会根据需要在应用程序中将系统时间转换为本地时间。比如直接执行date,是输出本地时间;此时date就是根据当前时区设置将系统时间换算为本地时间输出;如果修改时区后,再执行date,date会根据修改后的时区用系统时间计算出修改后的本地时间。

这也是很多命令-u的参数的意义,不过这一点倒没必要过于区分,比如大家一般都会认为系统时间就是本地时间,如果因为时区设置问题,导致执行date输出时间不是所处时区的时间的这种情况,大家都是说系统时间时区未正确设置。

实际上系统时间和硬件时间都是UTC时间运行,只不过大家都平时都没有去关注date、hwclock的-u,--utc项的意义,但那种通用的说法也不会影响平时使用。

夏令时

自1992年起,我国就没有再使用夏令时,系统时间也就不必设置开启夏令时。前面说到系统时间是根据硬件时间计算出来的,本地时间是当前时区的实际时间,考虑到夏令时(DST),硬件时钟可以使用UTC或本地时间,一般建议使用UTC。夏令时这部分内容简单了解一下就可以了,毕竟我国不用夏令时,全部关闭就可以了。

 

综述:根据这些杂谈,应该能够理解为什么hwclock -w后,进入BIOS查看硬件时间和系统时间和硬件时间刚好相差8个小时。因为真正的硬件时间是没有时区的概念,为了通用性,Linux默认是将硬件时间当作为UTC时间(当然这个可以更改设置),而UTC时间和你经常设置的北京时间就是恰好相差了8小时,同时也解释了类似date -u的意义。

看了杂谈可能会有点逻辑混乱,实际操作时还是按照平常的理解就可以了,毕竟时间这一块没那么复杂,只要设置对了时区,时间可以了,像timedatectl set-time、hwclock -w的时候需要考虑那么多,Linux会自动将本地时间计算为UTC时间记录到硬件时间上。

小知识

通常,英文文档中的time译作时间,也就是我们平时说的几点几分;date的译作日期,也就是我们平时说的几月几日;clock译作时钟,可以是硬件,也可以是一些工具,比如是real-time clock (RTC),准确的翻译应该是硬件时钟,是个硬件,系统时钟(system clock),Linux内核维护的一个“工具”。

posted @ 2018-07-26 10:48  YogurtWu  阅读(10343)  评论(0编辑  收藏  举报