智传网优云课堂,专注分享IT技术
与IT技术爱好者一起共同学习进步

设置修改Linux系统时间与时区的6种方法

1. 前言

如果你想修改Linux系统里的时间,本文合适你。Linux上有多种修改时间的命令工具,本文介绍最常用、最通用的方法。

linux修改时间

先来了解世界时间的标准,包括GMT、UTC、CST、DST、以及操作系统同步时间的方式

1.1 UTC

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

1.2 GMT

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

UT(世界时)和GMT(格林威治标准时)是相同的时间标准,都是基于天体观察的。
UT 是相同标准的“科学”名称。GMT:格林威治时间,是标准的“民间”名称。
因此,格林威治标准时(GMT)和世界时 (UT) 是相等的。

UTC是我们现在用的时间标准,GMT是老的时间计量标准。UTC是根据原子钟来计算时间,而GMT是根据地球的自转和公转来计算时间,也就是太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间就是中午12点。由于现在世界上最精确的原子钟50亿年才会误差1秒,可以说非常精确。而GMT因为是根据地球的转动来计算时间的,而地球的自转正在缓速变慢,所以使用GMT的话,会不太精准,一般情况那感觉不到差异,但是UTC更加科学和精确。

1.3 CST

中国标准时间 (China Standard Time)

1.4 DST

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

我们需要知道的是:
GMT + 8 = UTC + 8 = CST

1.5 操作系统时间

以Linux为例,其实Windows或者其他操作系统也是类似的。
Linux时间有两个时间:

  • Wall Time:系统时间,该时间由系统维护,可以是临时,也可以是网络上同步回来的,也可以是从硬件读取出来的,前提条件是系统服务正常运行,如果系统关机了,那就不存在Wall Time
  • RTC Time:RTC(Real-Time Clock)或CMOS时间,即硬件时间,你可以理解为主板BIOS里的时间,由一块小电池维持运转,持续更新的时间。与服务器本身是否通电无关,与服务器的操作系统也无关。当操作系统重启后,原来的Wall Time时间将会忘记,并重新读取RTC时间。注意的是,CMOS仅保存日期时间数值,无法保存时区和夏令时设置。

所以Wall Time时间可以不等于RTC Time(比如你通过网络同步了准确的时间,而发现你的硬件时间不准确)。当你认为Wall Time是正确的,RTC Time时间是错误的,这时,你可以把系统时间写入到硬件,执行命令hwclock –systohc

2. 查看时间与时区

[root@zcwyou ~]# date -R

输出结果:

Fri, 23 Nov 2018 20:08:42 -0500

查看当前时区:

[root@zcwyou ~]# ll /etc/localtime 

输出结果:

lrwxrwxrwx. 1 root root 38 Sep 26 22:33 /etc/localtime -> ../usr/share/zoneinfo/America/New_York

上面的输出信息表明,当前系统的时区为纽约,并非中国时区。

3. 修改Linux服务器时区

3.1 方法一:针对特定用户修改

使用tzselect指引,用于生产修改指引,命令本身并不会修改系统时间

[root@zcwyou ~]# tzselect

输出结果:

Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
1) Africa
2) Americas
3) Antarctica
4) Arctic Ocean
5) Asia
6) Atlantic Ocean
7) Australia
8) Europe
9) Indian Ocean
10) Pacific Ocean
11) none – I want to specify the time zone using the Posix TZ format.
#?

选择5,亚洲。

Please select a country.
1) Afghanistan 18) Israel 35) Palestine
2) Armenia 19) Japan 36) Philippines
3) Azerbaijan 20) Jordan 37) Qatar
4) Bahrain 21) Kazakhstan 38) Russia
5) Bangladesh 22) Korea (North) 39) Saudi Arabia
6) Bhutan 23) Korea (South) 40) Singapore
7) Brunei 24) Kuwait 41) Sri Lanka
8) Cambodia 25) Kyrgyzstan 42) Syria
9) China 26) Laos 43) Taiwan
10) Cyprus 27) Lebanon 44) Tajikistan
11) East Timor 28) Macau 45) Thailand
12) Georgia 29) Malaysia 46) Turkmenistan
13) Hong Kong 30) Mongolia 47) United Arab Emirates
14) India 31) Myanmar (Burma) 48) Uzbekistan
15) Indonesia 32) Nepal 49) Vietnam
16) Iran 33) Oman 50) Yemen
17) Iraq 34) Pakistan
#?

选择9,中国

Please select one of the following time zone regions.
1) Beijing Time
2) Xinjiang Time
#?

选择1北京时间

最后输出结果

The following information has been given:

China
Beijing Time

Therefore TZ=’Asia/Shanghai’ will be used.
Local time is now: Sat Nov 24 09:10:44 CST 2018.
Universal Time is now: Sat Nov 24 01:10:44 UTC 2018.
Is the above information OK?
1) Yes
2) No
#?

选择1,确认

根据以上提示,现在开始修改配置文件,针对当前用户生效

[root@zcwyou ~]# vi ~/.bash_profile 

添加以下内容,
TZ=’Asia/Shanghai’; export TZ

[root@zcwyou ~]# exit

重新登录系统,查看生效时间,已经成功。

[root@zcwyou ~]# date 

输出结果:
Sat Nov 24 09:15:02 CST 2018

创建一个测试账号试试

[root@zcwyou ~]# useradd ocr

切换到测试账号

[root@zcwyou ~]# su - ocr

查看时间:

[ocr@zcwyou ~]$ date 

输出结果:
Fri Nov 23 20:24:27 EST 2018

结论时,其他用户并没有生效。

退出测试账号,回到root用户。

[ocr@zcwyou ~]$ exit

3.2 方法2:针对所有用户,永久生效

如果想针对所有用户生效,修改/etc/localtime,/etc/localtime是一个链接文件,指向时区文件存放的位置/usr/share/zoneinfo/XXX/YYY

强制/etc/localtime软链接到/usr/share/zoneinfo/Asia/Shanghai

[root@zcwyou ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

检查:

[root@zcwyou ~]# ll /etc/localtime 

输出结果:
lrwxrwxrwx. 1 root root 33 Nov 24 09:25 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai

表明设置成功,当前系统时区为Asia/Shanghai

测试其他用户:

[root@zcwyou ~]# su - ocr

输出结果:
Last login: Sat Nov 24 09:24:25 CST 2018 on pts/1

[ocr@zcwyou ~]$ date 

输出结果:

Sat Nov 24 09:25:46 CST 2018

以上输出表明,所有账号设置已经立即生效,都在使用CST时间。

退出测试账号:

[ocr@zcwyou ~]$ exit

logout

删除测试账号:

[root@zcwyou ~]# userdel ocr

4. 查看和修改Linux的时间

4.1 查看时间和日期

[root@zcwyou ~]# date 

输出结果
Sat Nov 24 13:46:30 CST 2018
注:date命令不加参数可以直接看到当前日期时间

4.2 设置时间和日期

将系统日期设定成2019年10月30日

[root@zcwyou ~]# date -s 10/30/2019

输出:
Wed Oct 30 00:00:00 CST 2019

时间从00:00开始

将系统时间设定成下午6点6分06秒的命令

[root@zcwyou ~]# date -s 18:06:06

以上设置只是临时修改系统时间,当系统重新启动的时候就会失效,并重新使用硬件时间。

所以需要将当前时间和日期写入BIOS,避免重启后失效

[root@zcwyou ~]# hwclock -w

当然也可以直接修改硬件时间:

[root@zcwyou ~]# hwclock --set --date '2020-09-16 13:17:00' 

hwclock –show 查看硬件的时间
hwclock –hctosys 把硬件时间同步给操作系统,即以硬件时间为准。

5. RedHat Linux 7和 CentOS 7的时间日期工具

从CentOS 7开始,使用了一个新的时间工具timedatectl

5.1 使用timedatectl读取时间

timedatectl或者timedatectl status

[root@zcwyou ~]# timedatectl

输出结果:
Warning: Ignoring the TZ variable. Reading the system’s time zone setting only.

Local time: Sat 2018-11-24 10:03:47 CST
Universal time: Sat 2018-11-24 02:03:47 UTC
RTC time: Sat 2018-11-24 02:03:08
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a

5.2 使用timedatectl设置时间

命令格式:
timedatectl set-time “YYYY-MM-DD HH:MM:SS”
例如

[root@zcwyou ~]# timedatectl set-time "2018-11-24 12:00:30"

5.3 列出所有时区

[root@zcwyou ~]# timedatectl list-timezones

5.4 设置时区

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

5.5 是否NTP服务器同步

[root@zcwyou ~]# timedatectl set-ntp yes

yes或者no,NTP协议利用网络进行时间同步,使用非常普遍,特别是手机。

6. CentOS 6 使用NTP协议同步时间

CentOS 6 客户端配置如下:
安装ntp服务

[root@zcwyou ~]# yum  -y install ntp

设置时间源:

[root@zcwyou ~]# vi /etc/ntp.conf

添加以下内容:

server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst

防火墙设置允许NTP协议通过:

[root@zcwyou ~]# iptables -I INPUT -p udp -m udp --sport 123 -j ACCEPT
service iptables save

启动ntp协议

[root@zcwyou ~]# service ntpd start

设置ntp服务开机自启:

[root@zcwyou ~]# chkconfig --level 35 ntpd on

7. CentOS 7上使用NTP服务

7.1 搭建NTP服务器

安装相关服务:

[root@zcwyou ~]# yum -y install ntpdate ntp

修改配置文件

[root@zcwyou ~]# vi /etc/ntp.conf

按要求添加或者修改以下内容

#新增以下内容,添加日志.
logfile /var/log/ntpd.log

新增以下内容,只允许192.168.1.0/24网段上的所有设备从本机上查询和同步时间,假设你的客户端都在192.168.1.0/24网段上
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

前面加#注释以下服务器
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

#新增以下内容,添加国内的时间服务器地址
server 0.cn.pool.ntp.org iburst
server 1.cn.pool.ntp.org iburst
server 2.cn.pool.ntp.org iburst
server 3.cn.pool.ntp.org iburst

新增以下内容,当网络服务器不可用时,使用本地时间,假设本地IP为123.123.123.123
server 123.123.123.123 iburst
fudge 127.0.0.1 stratum 10

新增以下内容,允许上层时间服务器主动修改本机时间.
restrict 0.cn.pool.ntp.org nomodify notrap noquery
restrict 1.cn.pool.ntp.org nomodify notrap noquery
restrict 2.cn.pool.ntp.org nomodify notrap noquery

设置NTP服务开机自启

[root@zcwyou ~]# systemctl enable ntpd
[root@zcwyou ~]# systemctl enable ntpdate
[root@zcwyou ~]# systemctl is-enabled ntpd

同步时间:

[root@zcwyou ~]# ntpdate -u 1.cn.pool.ntp.org

当服务端与客户端之间的时间误差过大时,此时修改时间可能对系统或应用带来不可预知问题,NTP会停止时间同步。若检查NTP启动后时间未同步时,应考虑可能是时间误差过大所致,此时需要先手动设置时间,具体方法请看上面的教程。

启动NTP服务器:

[root@zcwyou ~]# systemctl start ntpdate
[root@zcwyou ~]# systemctl start ntpd

防火墙放开NTP服务器

[root@zcwyou ~]# firewall-cmd --permanent --add-service=ntp
[root@zcwyou ~]# firewall-cmd --reload

以上是自建的NTP服务器。

7.2 NTP客户端

安装NTP组件:

[root@zcwyou ~]# yum -y install sntp ntp ntpdate

修改ntp配置文件

[root@zcwyou ~]# vim /etc/ntp.conf

添加以下内容,假设你的NTP服务器IP为123.123.123.123:
server 123.123.123.123

必须重启ntpd服务才能使新配置生效:

[root@zcwyou ~]# systemctl restart ntpd

借用crontab计划任务工具,每天凌晨0点同步时间并写入硬件:

[root@zcwyou ~]# crontab -e

添加以下内容,假设你的NTP服务器IP为123.123.123.123

0 0 * * * /usr/sbin/sntp -P no -r 123.123.123.123;hwclock -w

在服务器群中使用以设置,确保所有服务器时间一致。

赞(0)
未经允许不得转载:Linux入门学习到精通 » 设置修改Linux系统时间与时区的6种方法
分享到: 更多 (0)

学习QQ群:557371664

关注微信公众号自助视频学习

评论 抢沙发

评论前必须登录!