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内核维护的一个“工具”。

CentOS 7 设置日期和时间的更多相关文章

  1. CentOS 7 设置日期和时间 timedatectl

    CentOS 7 设置日期和时间 在CentOS 6版本,时间设置有date.hwclock命令,从CentOS 7开始,使用了一个新的命令timedatectl. timedatectl [root ...

  2. Centos 7 修改日期和时间的命令

    timedatectl set-ntp no //关闭时间动态更新timedatectl set-time "YYYY-MM-DD HH:MM:SS" //设置时间和日期timed ...

  3. CentOS 7: 设置时区和时间

    查看当前时区和时间 $ date $ ls -l /etc/localtime 查看所有可用时区 $ timedatectl list-timezones | grep Asia 设置时区 $ tim ...

  4. CentOS 7 设置时区、日期和时间

    CentOS 7 设置时区.日期和时间 changhr2013关注 2019.04.19 01:33:09字数 307阅读 139 在 CentOS 7 中,引入了一个叫 timedatectl 的设 ...

  5. Centos date 设置自定义时间

    [1]手动修改 (1)设置日期 # date -s 20190315 (2)设置时间 # date -s 15:23:34 (3)设置日期和时间 # date -s "20190315 15 ...

  6. 【转】Pro Android学习笔记(十七):用户界面和控制(5):日期和时间控件

    目录(?)[-] DatePicker和TimePicker控件 DigitalClock和AnalogClock控件 DatePicker和TimePicker控件 使用DatePicker和Tim ...

  7. matlab中datest() 将日期和时间转换为字符串格式

    来源:https://ww2.mathworks.cn/help/matlab/ref/datestr.html?searchHighlight=datestr&s_tid=doc_srcht ...

  8. CentOS下date命令 - 显示和设置系统日期与时间

    显示系统日期 要显示系统日期,只要输入: $ date Thu Dec 5 22:55:41 WIB 2013 格式化显示日期 日期有很多格式.如果你不喜欢默认的格式,你可以换一种格式.你可能会想&q ...

  9. 解决CentOS 6环境时区、日期、时间同步方法

    有些时候我们在选择的VPS服务商提供的VPS主机方案安装系统.安装建站环境之后就直接上马网站,但是我们会有发现发布的文章或者有些时候设置的自动执行脚本时间与我们实际的时间不符合.甚至有些程序是需要与本 ...

随机推荐

  1. 张超超OC基础回顾_05 property修饰符,id类型,instancetype。。。

    一.property 如果给一个属性同时提供了getter/setter方法, 那么我们称这个属性为可读可写属性 如果只提供了getter方法, 那么我们称这个属性为只读属性 如果只提供了setter ...

  2. 关于sleep的理解

    unix是按时间片轮转调度, windows是抢占式调度 以吃蛋糕为例子,10个人吃蛋糕,如果是unix下, 假设开始时,每个人都处于就绪状态,那么操作系统调度大家排好队,按顺序吃,每个人吃1分钟, ...

  3. 基于Nginx实现集群原理

    1)安装Nginx 2)配置多个Tomcat,并修改端口号(两个端口号不一样即可) 3)在Nginx的Nginx.conf添加如下配置:

  4. CMake 自定义编译选项

    自定义编译选项 CMake 允许为项目增加编译选项,从而可以根据用户的环境和需求选择最合适的编译方案. 例如,可以将 MathFunctions 库设为一个可选库,如果该选项为 ON ,就使用该库定义 ...

  5. Django-----restframework图解

  6. sql server行列转化

    行列转换: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 想变成(得到如下结果): 姓名 语文 数学 物理 ---- - ...

  7. HDU 6055 Regular polygon (暴力)

    题意,二维平面上给N个整数点,问能构成多少个不同的正多边形. 析:容易得知只有正四边形可以使得所有的顶点为整数点.所以只要枚举两个点,然后去查找另外两个点就好. 代码如下: #pragma comme ...

  8. 如何为PAC运算设定请求集

    由于第一支PAC:定期请购成本处理程序 请求在运行过程中会自动提交 定期实际成本处理程序 请求,且 这两个请求不存在父子关系,导致 第二个请求尚未处理完成时 第一个请求已经运行完成,这就导致在设定请求 ...

  9. Oracle 定时任务讲解

    前几天,公司的job调度出现了问题,由于权限管的严,没有查看oracle 一些重要的数据字典,后面联系DBA,是由于数据库切换到备机时,参数设置不对,导致db job没有正常调度. 今天刚好有时间,想 ...

  10. 删除当前文件夹的bat工具

    @echo off:11set /p path=Please enter delete filepath:del /f /s /q %path%rd /q /s %path%goto 11pause