RHEL7、CentOS7提供三种命令行方式方式来设置和显示日期、时间。timedatectl是在RHEL7及CentOS7中新增的systemd的一部分,date是传统的日期时间设置命令,hwclock单元访问的是硬件时钟。

一、timedatectl

[root@Geeklp-Administrator ~]# timedatectl
      Local time: 六 2017-12-16 19:49:53 CST
  Universal time: 六 2017-12-16 11:49:53 UTC
        RTC time: 六 2017-12-16 11:43:53
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

默认是开启你ntp时间同步的,在修改NTP或chrony的时间设置之后不会立即生效,需要重启timedatectl服务。

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

(1)修改当前时间
timedatectl set-time HH:MM:SS
这个命令同时更新系统时间和硬件时钟,结果类似于date –set 和 hwclock –systohc 命令。开启NTP时间同步是不能用这个命令来设置时间,这一点需要注意一下。

[root@Geeklp-Administrator ~]# timedatectl set-time 13:00:27
Failed to set time: Automatic time synchronization is enabled
[root@Geeklp-Administrator ~]# timedatectl set-ntp no
[root@Geeklp-Administrator ~]# timedatectl set-time 13:00:27
[root@Geeklp-Administrator ~]# timedatectl 
      Local time: 六 2017-12-16 13:01:12 CST
  Universal time: 六 2017-12-16 05:01:12 UTC
        RTC time: 六 2017-12-16 05:01:13
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

系统默认的时间设置使用的UTC,设置系统时间使用本地时间。

timedatectl set-local-rtc boolean

boolean值为:yes (或者y, true, t, 1)。当boolean值为no时使用的是UTC时间,此时的值为:no(或者n, false, f, 0),默认值为no。

[root@Geeklp-Administrator ~]# timedatectl set-local-rtc no

如果设置为yes的话可能会有警告,此处不建议修改为yes。
(2)修改或设置时区。
列举出所有可用的时区,键入以下命令即可。当然也可以输入tzselect根据引导进行设置(推荐)。

timedatectl list-timezones

在root用户下键入以下命令来修改当前使用的区时。例如我们将区时改为香港。

[root@Geeklp-Administrator ~]# timedatectl set-timezone Asia/Hong_Kong
[root@Geeklp-Administrator ~]# timedatectl 
      Local time: 六 2017-12-16 16:43:12 HKT
  Universal time: 六 2017-12-16 08:43:12 UTC
        RTC time: 六 2017-12-16 08:43:11
       Time zone: Asia/Hong_Kong (HKT, +0800)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

(3)如果使用远程的NTP时间服务器来提供时间的话,需要使用timedatectl设置将NTP时间同步开启。

[root@Geeklp-Administrator ~]# timedatectl set-ntp yes
[root@Geeklp-Administrator ~]# timedatectl 
      Local time: 六 2017-12-16 16:46:15 HKT
  Universal time: 六 2017-12-16 08:46:15 UTC
        RTC time: 六 2017-12-16 08:46:15
       Time zone: Asia/Hong_Kong (HKT, +0800)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

二、date

(1)显示当前日期和时间

[root@Geeklp-Administrator ~]# date
2017年 12月 18日 星期一 15:45:10 CST

(2)默认情况下,date显示的是本地时间。如果需要显示UTC时间,键入以下命令:

[root@Geeklp-Administrator ~]# date --utc
2017年 12月 18日 星期一 07:32:43 UTC

(3)我们也可以通过+format来控制显示信息。

[root@Geeklp-Administrator ~]# date +"%H"
16
[root@Geeklp-Administrator ~]# date +"%M"
23
[root@Geeklp-Administrator ~]# date +"%D"
12/18/17
[root@Geeklp-Administrator ~]# date +"%Y"
2017
[root@Geeklp-Administrator ~]# date +"%F"
2017-12-18
[root@Geeklp-Administrator ~]# date +"%T"
16:23:31
[root@Geeklp-Administrator ~]# date +"%d"
18
[root@Geeklp-Administrator ~]# date +"%Y-%m-%d %H:%M"
2017-12-18 16:26

部分可用选项详见下表:

控制符

描述

%H

  小时(for example, 17).

%M

  分钟 (for example, 30).

%S

  秒(for example, 24).

%d

  月份中的某一天(for example, 16).

%m

  月份中的某一个月(for example, 09).

%Y

  年份 (for example, 2016).

%F

  完整的日期格式 (for example, 2016-09-16). 这个选项相当于: %Y-%m-%d.

%T

  完整的时间格式 (for example, 17:30:24). 这个选项相当于%H:%M:%S

(4)通过date命令来修改当前时间。可用date –set或date -s命令。可用选项–utc或-u来指定是否为UTC时间。

[root@Geeklp-Administrator ~]# date --set 12:43:23
2017年 12月 18日 星期一 12:43:23 CST
[root@Geeklp-Administrator ~]# date --set 2017-12-19
2017年 12月 19日 星期二 00:00:00 CST
[root@Geeklp-Administrator ~]# date --set '2017-12-17 12:43:23'
2017年 12月 17日 星期日 12:43:23 CST
[root@Geeklp-Administrator ~]# date --set '2017-12-17 12:43:23' -u
2017年 12月 17日 星期日 12:43:23 UTC
[root@Geeklp-Administrator ~]# date --set '2017-12-17 12:43:23' --utc
2017年 12月 17日 星期日 12:43:23 UTC
[root@Geeklp-Administrator ~]# date --s '2017-12-17 12:43:23' --utc
2017年 12月 17日 星期日 12:43:23 UTC
[root@Geeklp-Administrator ~]# date -s '2017-12-17 12:43:23' --utc
2017年 12月 17日 星期日 12:43:23 UTC

需要注意的是:设置完整的日期时间时需要使用引号。

三、hwclock

硬件时钟,顾名思义,这个时间时存储在服务器主板上的时钟。硬件时钟存储的值包括:年、月、日、时、分、秒。不存储时间标准、本地时间、UTC、DST。这些设置存放在/etc/adjtime中,当我们修改时间设置(包括手动设置和自动同步)时该文件被创建。在RHEL6或CentOS6系统中,系统每次关机或重启都会自动执行这个命令。在RHEL7或CentOS7中,当系统时间向NTP服务器或PTP服务器同步时间后,每隔11分钟内核自动同步硬件时钟到系统时钟。
(1)显示硬件时钟。

[root@Geeklp-Administrator ~]# hwclock 
2017年12月18日 星期一 16时39分40秒  -0.110050 秒
[root@Geeklp-Administrator ~]# hwclock --show
2017年12月18日 星期一 16时39分57秒  -0.293885 秒

(2)将硬件时钟同步给系统时钟。

[root@Geeklp-Administrator ~]# hwclock -s
[root@Geeklp-Administrator ~]# hwclock --hctosys
[root@Geeklp-Administrator ~]# hwclock 
2017年12月18日 星期一 17时17分39秒  -0.953704 秒

-s和–hctosys效果是一样的。
(3)将系统时间写入硬件时钟。

[root@Geeklp-Administrator ~]# hwclock -w
[root@Geeklp-Administrator ~]# hwclock 
2017年12月18日 星期一 17时02分16秒  -0.646804 秒
[root@Geeklp-Administrator ~]# hwclock --systohc
[root@Geeklp-Administrator ~]# date
2017年 12月 18日 星期一 17:14:08 CST
[root@Geeklp-Administrator ~]# hwclock 
2017年12月18日 星期一 17时14分17秒  -0.285800 秒

(4)手动设置硬件时钟。使用命令:hwclock –set –date 。

[root@Geeklp-Administrator ~]# hwclock -s --date "12 oct 2013 13:01"
[root@Geeklp-Administrator ~]# hwclock 
2017年12月18日 星期一 17时09分37秒  -0.047061 秒
[root@Geeklp-Administrator ~]# date
2017年 12月 18日 星期一 17:09:44 CST
[root@Geeklp-Administrator ~]# hwclock --set --date "2015-11-23 21:17:23" --utc
[root@Geeklp-Administrator ~]# hwclock 
2015年11月23日 星期一 21时18分53秒  -0.208850 秒
[root@Geeklp-Administrator ~]# date 
2017年 12月 18日 星期一 17:12:54 CST

四、关于时区

1、UTC:
Universal Time Coordinated 协调世界时,又称世界标准时间。多数的两地时间表都以GMT来表示,但也有些两地时间表上看不到GMT字样,出现的反而是UTC这3个英文字母,究竟何谓UTC?事实上,UTC指的是Coordinated Universal Time– 世界协调时间(又称世界标准时间、世界统一时间),是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。其误差值必须保持在0.9秒以内,若大于0.9秒则由位于巴黎的国际地球自转事务中央局发布闰秒,使UTC与地球自转周期一致。所以基本上UTC的本质强调的是比GMT更为精确的世界时间标准,不过对于现行表款来说,GMT与UTC的功能与精确度是没有差别的。
2、GMT:
Greenwich Mean Time 格林尼治平均时
UTC和GMT都与英国伦敦的本地时相同,所以程序中UTC与GMT没什么不同。意思UTC=GMT是相等的
十七世纪,格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测。1675年旧皇家观测所(Old Royal Observatory) 正式成立,到了1884年决定以通过格林威治的子午线作为划分地球东西两半球的经度零度。观测所门口墙上有一个标志24小时的时钟,显示当下的时间,对全球而言,这里所设定的时间是世界时间参考点,全球都以格林威治的时间作为标准来设定时间,这就是我们耳熟能详的「格林威治标准时间」(Greenwich Mean Time,简称G.M.T.)的由来,标示在手表上,则代表此表具有两地时间功能,也就是同时可以显示原居地和另一个国度的时间。
3、Unix时间戳:
在计算机中看到的UTC时间都是从(1970年01月01日 0:00:00)开始计算秒数的。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒。 这个秒数就是Unix时间戳。
4、CST时间:
CST却同时可以代表如下 4 个不同的时区:
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
5、CET
(英語:Central European Time,CET)欧洲中部时间是比世界标准时间(UTC)早一个小时的时区名称之一。它被大部分欧洲国家和部分北非国家采用。冬季时间为UTC+1,夏季欧洲夏令时为UTC+2。
6、DST:
Daylight Saving Time「夏日节约时间」
是指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用,在英国则称为夏令时间(Summer Time)。这个构想于1784年由美国班杰明·富兰克林提出来,1915年德国成为第一个正式实施夏令日光节约时间的国家,以削减灯光照明和耗电开支。自此以后,全球以欧洲和北美为主的约70个国家都引用这个做法。目前被划分成两个时区的印度也正在商讨是否全国该统一实行夏令日光节约时间。欧洲手机上也有很多GSM系统的基地台,除了会传送当地时间外也包括夏令日光节约时间,做为手机的时间标准,使用者可以自行决定要开启或关闭。值得注意的是,某些国家有实施「夏日节约时间」的制度,出国时别忘了跟随当地习惯在表上调整一下,这可是机械表没有的功能设计哦!
7、关系:
UTC=GMT
CET=UTC/GMT + 1小时
CST=UTC/GMT +8 小时
CST=CET+9
参考资料:
http://www.jinbuguo.com/systemd/timedatectl.html#list-timezones