Centos更新系统时间

CentOS 7更新系统时间 Linux系统在安装的时候,总是会出现时区,时间的错误。 将Linux系统时间和本地区网络时间同步,ntpdate可以从网络同步时间, 需要安装 yum install ntp ntpdate,设置开机自启systemctl start ntpdsystemctl enable ntpd。 ntp只能同步时间,使用timedatectl设置时区,timedatectl命令在systemd包中,默认安装。 timedatectl可以查看时间和时区,timedatectl list-timezones查看所有的时区,timedatectl set-zone Asia/Shanghai设置时区为上海,执行ntpdate同步Asia/Shanghai的时间。

查看系统时区
Centos更新系统时间_第1张图片

由Linux内核管理的时钟与硬件时钟不同。

硬件时钟运行,即使您关闭您的系统。

硬件时钟也称为BIOS时钟。您可以从BIOS更改硬件时钟的日期和时间。

但是,当系统启动并运行时,仍然可以使用Linux hwclock命令查看和设置硬件日期和时间,如本教程所述。

1. 显示硬件时钟日期和时间

只需输入hwclock,它将显示系统硬件时钟的日期和时间。这是您将在BIOS屏幕上看到的相同日期和时间。您还可以使用选项-r或-show来显示日期和时间。

[root@localhost ~]# hwclock

2019年07月15日 星期一 22时10分57秒  -0.983165 秒

[root@localhost ~]# hwclock -r

2019年07月15日 星期一 22时11分13秒  -0.456334 秒

[root@localhost ~]# hwclock --show

2019年07月15日 星期一 22时11分32秒  -0.944544 秒

注意:date命令的输出可能与hwclock命令的输出相同(实际上应该是相同的)。但是,date命令从Linux内核管理的时钟中获取日期和时间。在这个例子中,它们之间大约有10分钟的差异。

[root@localhost ~]# date

2019年 07月 15日 星期一 22:00:02 CST

2. 将系统时间复制到硬件时间

您确实希望确保硬件时钟具有与系统时钟相同的日期和时间。

正如您目前所看到的,系统时钟和硬件时钟时间之间存在差异。

[root@localhost ~]# date

2019年 07月 15日 星期一 22:00:28 CST

[root@localhost ~]# hwclock

2019年07月15日 星期一 22时14分38秒  -0.957394 秒

因此,使用如下所示的hwclock命令将硬件时钟设置为与系统时钟相同。这是hwclock命令的典型用法。

[root@localhost ~]# hwclock -w

[root@localhost ~]# hwclock 

2019年07月15日 星期一 22时17分47秒  -0.066152 秒

[root@localhost ~]# date

2019年 07月 15日 星期一 22:17:50 CST

注意:-w和-systohc选项都执行相同的操作。我喜欢用-systohc,因为它很容易记住。systohc代表“系统到硬件时钟”,它将时间从系统复制到硬件时钟。

[root@localhost ~]# hwclock --systohc

3.手动设置硬件时钟日期和时间

您还可以使用-set和-date选项手动设置值,而不是将系统日期和时间复制到硬件时钟,如下所示。

以下日期为2019年8月11日。请注意,如果您没有指定时间,它将被设置为12:00 AM。

[root@localhost ~]# hwclock --set --date 8/11/2019

[root@localhost ~]# hwclock 

2019年08月11日 星期日 00时00分09秒  -0.254716 秒

您还可以同时设置日期和时间,如下所示。请注意,它默认使用本地时间。

[root@localhost ~]# hwclock --set --date "8/11/2019 23:10:45"

[root@localhost ~]# hwclock

2019年08月11日 星期日 23时10分49秒  -0.083291 秒

您还可以获取date命令的输出,并将其传递给-set和-date选项,如下所示。

[root@localhost ~]# hwclock --set --date "Sat Aug 10 08:31:24 PDT 2019"

[root@localhost ~]# hwclock

2019年08月10日 星期六 23时31分33秒  -0.184209 秒

4. 将硬件时间复制到系统时间

当硬件时钟显示正确的日期和时间,而不是系统时钟时,可以使用-s选项将硬件时间复制到系统时间,如下所示。

[root@localhost ~]# hwclock 

2019年08月10日 星期六 23时32分12秒  -0.439396 秒

[root@localhost ~]# date

2019年 07月 15日 星期一 22:22:31 CST

[root@localhost ~]# hwclock -s

[root@localhost ~]# date

2019年 08月 10日 星期六 23:32:36 CST

注意:-s和-hctosys选项都是一样的。我喜欢用-hctosys,因为它很容易记住。-hctosys代表“硬件时钟到系统”,它将时间从硬件时钟复制到系统时钟。

[root@localhost ~]# hwclock -hctosys

用法:

 hwclock [功能] [选项...]

在测试此功能时,如果您已经错开了系统时间,可以使用date命令示例将其设置为正确的日期和时间。

5. hwclock调试模式

当您将-debug选项传递给hwclock时,它会显示一些调试信息,这些信息准确地显示了hwclock命令的功能。

下面显示了当我们将系统时间复制到硬件时间时,它会做什么。

[root@localhost ~]# hwclock --systohc --debug

hwclock,来自 util-linux 2.23.2

将使用 /dev interface to clock。

上次漂移调整完成于1969(年)后 1565451084 秒

上次校准完成于1969(年)后 1565451084 秒

硬件时钟为 UTC 时间

将假设硬件时钟保持为 UTC 时间。

正在等等时钟滴答...

...已获取时钟滴答

从硬件时钟读取的时间:2019/08/10 15:33:57

硬件时钟时间:2019/08/10 15:33:57 = 1969(年)后 1565451237 秒

1565451237.500000 is close enough to 1565451237.500000 (0.000000 < 0.001000)

Set RTC to 1565451237 (1565451237 + 0; refsystime = 1565451237.000000)

正在将硬件时钟设置为 15:33:57 = 1969(年)后 1565451237 秒

ioctl(RTC_SET_TIME) 成功。

将不调整漂移系数,因为从上次校准还不到一天。

下面显示了当我们将硬件时间复制到系统时间时,它会做什么。

[root@localhost ~]# hwclock -hctosys --debug

用法:

 hwclock [功能] [选项...]

注意:在alpha机器上,可以使用getepoch查看历元,setepoch设置历元。当您尝试在a on Alpha机器上运行这个程序时,您将得到以下错误机器。

[root@localhost ~]# hwclock --setepoch --epoch=1952

hwclock: 只有在 Alpha 计算机上内核才会为硬件时钟保持一个纪元(epoch)值。

这版 hwclock 程序不是为 Alpha 计算机编译的(因此目前也不打算在 Alpha

 计算机上运行)。未执行任何操作。

6. 调整硬件时钟

当系统启动时,它占用硬件时钟的时间。hwclock -adjust选项使用/etc/adjtime文件来控制调整。

[root@localhost ~]# hwclock --adjust

/etc/adjtime文件有以下三行。

[root@localhost ~]# cat /etc/adjtime

0.004102 1565451237 0.000000

1565451237

UTC

*第一行的三个值表示1)系统漂移率(以秒为单位),2)自1969年UTC最近调整以来的秒数(仅0)

*第2行与第1行相同。我。自1969年UTC调整以来的秒数

*第3行将显示UTC或LOCAL

7. hwclock测试模式

当您使用hwclock(使用-test选项)更改内容时,您可以在不做任何更改的情况下执行命令。

systz选项将相应地更改系统时区。但是,由于我们给出了-test,所以它不会真正进行更改,但是它仍然可以毫无问题地执行命令。

[root@localhost ~]# hwclock --systz --test

将不设置系统时钟,因为正以测试方式运行。

测试模式的最佳用法是将其与调试选项组合使用。我。当您想要查看hwclock命令做什么,但不做任何更改时。

[root@localhost ~]# hwclock --systz --test --debug

hwclock,来自 util-linux 2.23.2

上次漂移调整完成于1969(年)后 1565451237 秒

上次校准完成于1969(年)后 1565451237 秒

硬件时钟为 UTC 时间

将假设硬件时钟保持为 UTC 时间。

当前系统时间:1565451565 = 2019/08/10 15:39:25

正在调用 settimeofday:

UTC:2019/08/10 15:39:25

tv.tv_sec = 1565451565, tv.tv_usec = 560400

tz.tz_minuteswest = -480

将不设置系统时钟,因为正以测试方式运行。

下面显示了-adjust选项在不做任何调整的情况下所做的工作。

[root@localhost ~]# hwclock --adjust --test --debug

hwclock,来自 util-linux 2.23.2

将使用 /dev interface to clock。

上次漂移调整完成于1969(年)后 1565451237 秒

上次校准完成于1969(年)后 1565451237 秒

硬件时钟为 UTC 时间

将假设硬件时钟保持为 UTC 时间。

正在等等时钟滴答...

...已获取时钟滴答

从硬件时钟读取的时间:2019/08/10 15:40:09

硬件时钟时间:2019/08/10 15:40:09 = 1969(年)后 1565451609 秒

时间自上次调整过去了 372 秒

需要插入 0 秒并将时间往回指 0.000018 秒

需要的调整不到一秒,将不设置时钟。

功能说明:显示与设定硬件时钟。
 
语  法:hwclock [--adjust][--debug][--directisa][--hctosys][--show][--systohc][--test]
[--utc][--version][--set --date=<日期与时间>]
 
补充说明:在Linux中有硬件时钟与系统时钟等两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。当Linux启动时,系统时钟会去读
 
取硬件时钟的设定,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。
 
参  数:
  --adjust  hwclock每次更改硬件时钟时,都会记录在/etc/adjtime文件中。使用--adjust参数,可使hwclock根据先前的记录来估算硬件时钟的偏差,并用来校正目前的硬件时钟。 
  --debug  显示hwclock执行时详细的信息。 
  --directisa  hwclock预设从/dev/rtc设备来存取硬件时钟。若无法存取时,可用此参数直接以I/O指令来存取硬件时钟。 
  --hctosys  将系统时钟调整为与目前的硬件时钟一致。 
  --set --date=<日期与时间>  设定硬件时钟。 
  --show  显示硬件时钟的时间与日期。 
  --systohc  将硬件时钟调整为与目前的系统时钟一致。 
  --test  仅测试程序,而不会实际更改硬件时钟。 
  --utc  若要使用格林威治时间,请加入此参数,hwclock会执行转换的工作。 
  --version  显示版本信息。
 
 
注:要使系统时间准确,最好还是使用ntp方式。
 
示例:使用ntpdate命令从网络同步时间,再同步到硬件时钟
ntpdate命令是使用NTP协议来从网络同步时间的命令。NTP=Network Time Protocol 网络时间协议。
 
[[email protected]~]# ntpdate 0.rhel.pool.ntp.org
 6 Nov 21:17:55 ntpdate[4829]: step time server 123.146.124.28 offset -1.025258 sec
[[email protected]~]# date
2010年 11月 06日 星期六 21:17:59 CST
[[email protected]~]# hwclock -w
 
扩展阅读一:hwclock 使用
 
Linux机器上的时间比较复杂,有各式各样的时钟和选项等等。
 
一:
机器里有两个时钟:硬件时钟和系统时钟
硬件时钟从根本上讲是CMOS时钟;
系统时钟是由内核维护的,它是从1969年末(即传说中的标志Unix时代开端的那个拂晓)开始算起的累积秒数。
 
在DOS或Mac系统中,起作用的是硬件时钟。遗憾的是,你可能已经发现了,绝大多数电脑时钟都是很不准确的。它们从根本上讲是由小型电池供电的警报器时钟,这种锂电池一般可持续供电三年左右,
 
那时候你系统各大块差不多都已经过时了。
 
而在Linux系统中,起作用的是系统时钟。在启动时,它靠读取硬件时钟获得计时起点,而不是靠记忆计时。
 
 
你可以通过BIOS修改系统硬件时钟,或者如果你不想重起机器,那就用clock -w命令。
 
当你使用hwclock命令调整硬件时间很多次以后,hwclock就会获取你的时钟推移速率,然后就会把这个信息存在/etc/adjtime里边。以后,你就可以用它来随时更新你的硬件时间,用一条下面的命令:
 
hwclock --adjust
 
硬件时钟通常被设置成全球标准时间(UTC),而将时区信息保存在/usr/share/lib/timezone (或者在某些系统中可能是/usr/local/timezone)目录下某个适当的文件中,然后用一个符号链接文
 
件/etc/localtime指向它。
 
查看硬件时钟用命令:
 
hwclock --show 或者 hwclock -r
 
重置硬件时钟用:
#date 042817252009.00 //设置系统时钟 2009 年 04 月 28 日 星期四 17:25:00 CST
#hwclock -w
 
如果需要修改你的时区信息,可以使用tzset命令,如果你系统中没有这条命令,那可以用类似下面的操作:
 
ln -s /etc/localtime /usr/share/zoneinfo/US/Pacific
 
二:
实例:
板子上电
#date 042817252009.00 //设置系统时钟 2009 年 04 月 28 日 星期四 17:25:00 CST
#hwclock -w //将系统时钟写入硬件时钟
#hwclock -r //看时间是否在变化
如果没有出错, 就已经把2009 年 04 月 28 日 星期四 17:25:00 CST 写入RTC chip了
 
为了使系统时间和RTC时间同步,可以在初始化文件中添加命令
hwclock –s
使每次开机时读取RTC时间,并同步给系统时间。
在根文件系统:usr/etc/rc.local中添加
/sbin/hwclock -s
 
断电
等2分钟在上电
#hwclock -r //看时间是否同步,即使与2分钟后的时间相同
 
扩展阅读二:linux中时间设置date、hwclock、clock
 
Windows时钟大家可能十分熟悉了,Linux时钟在概念上类似Windows时钟显示当前系统时间,但在时钟分类和设置上却和Windows大相径庭。和Windows不同的是,Linux将时钟分为系统时钟(System 
 
Clock)和硬件(Real Time Clock,简称RTC)时钟两种。系统时间是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的"Standard BIOS 
 
Feture"项中进行设置。
 
既然Linux有两个时钟系统,那么大家所使用的Linux默认使用哪种时钟系统呢?会不回出现两种系统时钟冲突的情况呢?这些疑问和担心不无道理。首先,Linux并没有默认哪个时钟系统。当Linux启动
 
时,系统时钟会去读取硬件时钟的设置,然后系统时钟就会独立于硬件运作。
 
从Linux启动过程来看,系统时钟和硬件时钟不会发生冲突,但Linux中的所有命令(包括函数)都是采用的系统时钟设置。不仅如此,系统时钟和硬件时钟还可以采用异步方式,即系统时间和硬件时间可
 
以不同。这样做的好处对于普通用户意义不大,但对于Linux网络管理员却有很大的用处。例如,要将一个很大的网络中(跨越若干时区)的服务器同步,假如位于美国纽约的Linux服务器和北京的Linux服
 
务器,其中一台服务器无须改变硬件时钟而只需临时设置一个系统时间,如要将北京服务器上的时间设置为纽约时间,两台服务器完成文件的同步后,再与原来的时钟同步一下即可。这样系统和硬件时
 
钟就提供了更为灵活的操作。
 
在Linux中,用于时钟查看和设置的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只不过clock命 令除了支持x86硬件体系外,还支持Alpha硬件体系。由于目前绝大多数用户使用
 
x86硬件体系,所以可以视这两个命令为一个命令来学习。
 
    1.在虚拟终端中使用date命令来查看和设置系统时间
    查看系统时钟的操作:
    # date
 
    设置系统时钟的操作:
    # date 091713272003.30
 
    通用的设置格式:
    # date 月日时分年.秒
 
    2.使用hwclock或clock命令查看和设置硬件时钟
    查看硬件时钟的操作:
    # hwclock --show 或
    # clock --show
    2003年09月17日 星期三 13时24分11秒 -0.482735 seconds
 
    设置硬件时钟的操作:
    # hwclock --set --date="09/17/2003 13:26:00"
 
    或者
    # clock --set --date="09/17/2003 13:26:00"
 
    通用的设置格式:hwclock/clock --set --date=“月/日/年时:分:秒”。
 
    3.同步系统时钟和硬件时钟
 
    Linux系统(笔者使用的是Red Hat 8.0,其它系统没有做过实验)默认重启后,硬件时钟和系统时钟同步。如果不大方便重新启动的话(服务器通常很少重启),使用clock或hwclock命令来同步系统时
 
钟和硬件时钟。
 
    硬件时钟与系统时钟同步:
    # hwclock --hctosys
 
    或者
    # clock --hctosys
 
    上面命令中,--hctosys表示Hardware Clock to SYStem clock。
 
    系统时钟和硬件时钟同步:
    # hwclock --systohc
 
    或者
    # clock --systohc

命令
timedatectl set-timezone Asia/Shanghai (这里是设置亚洲上海上海)

Centos更新系统时间_第2张图片

时钟概念

(1)UTC 

整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC,Universal Time Coordinated)。

(2)GMT

格林威治标准时间 (Greenwich Mean Time)指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。(UTC与GMT时间基本相同,本文中不做区分)

(3)CST

中国标准时间 (China Standard Time)【GMT + 8 = UTC + 8 = CST】

(4)DST

夏令时(Daylight Saving Time) 指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用。(中国不使用)

硬件时钟:

RTC(Real-Time Clock)或CMOS时钟,一般在主板上靠电池供电,服务器断电后也会继续运行。仅保存日期时间数值,无法保存时区和夏令时设置。

系统时钟:

一般在服务器启动时复制RTC时间,之后独立运行,保存了时间、时区和夏令时设置。

在CentOS 6版本,时间设置有date、hwclock命令,从CentOS 7开始,使用了一个新的命令timedatectl。

Centos7 修改系统时区timezone  ,解决快、慢8小时问题

如果服务器用非 UTC 的时间,时区转换很容易不一致,而且对于有 daylight saving 的时区,每年多一小时少一小时的那两天,系统就会出现各种诡异现象。

服务器使用UTC时间,如要显示用户所在时区的本地时间,在客户端转化即可。

一、查看服务器使用的时间类型

# timedatectl

Centos更新系统时间_第3张图片

我们可以看到,服务器使用的CST 时间

二、将服务器时间类型改为UTC

方法一:

# timedatectl  set-timezone UTC

#  timedatectl set-time "YYYY-MM-DD HH:MM:SS"

#  timedatectl set-time   "HH:MM:SS"

# timedatectl

Centos更新系统时间_第4张图片

我们可以看到,服务器时间类型更改为UTC了

# ll   /etc/locatime

lrwxrwxrwx. 1 root root 25 1月  14 08:30 /etc/localtime -> ../usr/share/zoneinfo/UTC

实际上是做了一个将 

 文件  /etc/localtime  做了一个软连接到 /usr/share/zoneinfo/UTC

方法二:

#  ln  -s   /usr/share/zoneinfo/UTC    /etc/localtime

ln: 无法创建符号链接"/etc/localtime": 文件已存在

#  ln  -sf /usr/share/zoneinfo/UTC    /etc/localtime

做软连接时,需要加 -f 参数,强制覆盖,不然会显示软链接已存在

#  timedatectl set-time "YYYY-MM-DD HH:MM:SS"

#  timedatectl set-time   "HH:MM:SS"    //只设置时分秒

# timedatectl

Centos更新系统时间_第5张图片

三、将系统时间写入硬件CMOS

#  clock  -w

#  date   -u    //显示UTC时间

CentOS7修改时区的正确姿势

CentOS7上运行Java程序,发现程序生成的时间与当前时间匹配不上,还以为是数据停止更新了,后来发现没有正确使用修改时区的姿势,导致程序时区错误。

正确的修改CentOS7 时区的姿势:

#   ln -sf /usr/share/zoneinfo/Asia/Shanghai    /etc/localtime

其他系统的修改文件可能是/var/etc/localtime.

错误的姿势:通过cp命令覆盖/etc/localtime时间

 #  cp -f /usr/share/zoneinfo/Asia/Shanghai    /etc/localtime

通过cp命令修改时区,通过date, data -R命令显示的时区都是正确的,可是对于java程序而言,是错误的。

具体原因在于Java访问系统时区的方式上,可参见文章:

Java TimeZone 和 Linux TimeZone问题

https://my.oschina.net/huawu/blog/4646

该文章很好的说明了Java访问系统时区的方式:

1. 如有环境变量 TZ设置,则用TZ中设置的时区

2. 在 /etc/sysconfig/clock文件中找 “ZONE”的值

3. 如何2)都没,就用/etc/localtime 和 /usr/share/zoneinfo 下的时区文件进行匹配,如找到匹配的,就返回对应的路径和文件名。 

问题在于,如果使用cp命令来修改/etc/localtime文件,那么可能就会导致修改的不是/etc/localtime文件,而是原时区的文件内容。

/etc/localtime是通过符号链接链接/usr/share/zoneinfo下的文件,而java是通过文件名来确认时区的,data命令是通过文件内容确认时区的,这样就导致了data命令时区正确,而java的时区是错误的!

Centos更新系统时间_第6张图片

如上图所示:CentOS7是通过符号链接到/usr/share/zoneinfo/下的时区文件的,如果通过cp指令只会修改原时区文件内容,这样,通过date的系统命令,查看时间是OK的,可是java是通过读取文件名的方式确认时区信息的。所以时区还是纽约。



作者:MissHandsome
链接:https://www.jianshu.com/p/ab82790836df
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

—————————
版权声明:本文为CSDN博主「xiezhaoxian」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xzx208/article/details/82759825


作者:小胡_c7bc
链接:https://www.jianshu.com/p/a2afcc9db9c4
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(Linux)