zoukankan      html  css  js  c++  java
  • 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内核维护的一个“工具”。

  • 相关阅读:
    Python 学习笔记 11.模块(Module)
    Python 学习笔记 8.引用(Reference)
    Python 学习笔记 9.函数(Function)
    Python 学习笔记 6.List和Tuple
    Python 学习笔记 4.if 表达式
    Python 学习笔记 2.自省
    Python 学习笔记 3.简单类型
    Python 学习笔记 7.Dictionary
    Python 学习笔记 5.对象驻留
    Python 学习笔记 10.类(Class)
  • 原文地址:https://www.cnblogs.com/yogurtwu/p/9343213.html
Copyright © 2011-2022 走看看