时间的分类
- 系统时间 (即软件时间)与硬件时间分别维护,保存了:时间、时区和夏时令设置,linux内核保存为自UTC时间1970年1月1日经过的秒数。初始系统的时钟从硬件时间计算得来,计算时会考虑/etc/dajtime的设置,系统启动之后,系统时钟与硬件时钟独立运行,linux通过时钟中断计数维护系统时钟;
- 硬件时间 (即实时时钟RTC或CMOS时钟),仅能保存年、月、日、时、分、秒这些时间数值,无法保存时间标准(UTC或localtime)
- UTC时间 UTC是指的是协调世界时,又称为世界统一时间、国际协调时间,由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称为UTC,中国大陆的时间比UTC快8小时,写作UTC+8
- RTC时间 (Real_Time Clock)实时时钟的缩写是RTC,RTC是集成电路,通常称为时钟芯片,目前实时的时钟芯片大多采用精度较高的晶体震荡器作为时钟源
- localtime 本地时间,CST(China Standard Time)
时间相关命令
- 读取时间 timedatectl / date / hwclock --show
[root@localhost rpmbuild]# timedatectl (查看所有的时间)
Local time: 五 2021-03-12 16:02:18 CST
Universal time: 五 2021-03-12 08:02:18 UTC
RTC time: 五 2021-03-12 16:02:19
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: yes
[root@localhost rpmbuild]# date (查看系统时间)
2021年 03月 12日 星期五 16:07:02 CST
[root@localhost rpmbuild]# hwclock --show (查看硬件时间)
2021-03-12 16:24:59.962795+08:00
- 设置时间
date -s hwclock -w
[root@localhost rpmbuild]# date -s "2021-03-12 16:15:00"
2021年 03月 12日 星期五 16:15:00 CST
这种方法仅是设置系统时间,并没有将时间同步到硬件中,需要执行hwclock -w,将系统时间同步到硬件时间
hwclock --set --date 设置硬件时间
[root@localhost rpmbuild]# hwclock --set --date "2021-03-13 18:11:11"
[root@localhost rpmbuild]# hwclock --show
2021-03-13 18:11:18.587175+08:00
hwclock -s / hwclock --hctosys 系统时间同步硬件时间
[root@localhost rpmbuild]# hwclock -s
[root@localhost rpmbuild]# date
2021年 03月 13日 星期六 18:13:00 CST
hwclock -w /hwclock --systohc 硬件时间同步系统时间
timedatectl set-time "2021-03-12 16:33:00" (这种设置时间的方法自动会将系统时间同步到硬件)
[root@localhost rpmbuild]# timedatectl set-time "2021-03-12 16:33:00"
[root@localhost rpmbuild]# timedatectl
Local time: 五 2021-03-12 16:33:04 CST
Universal time: 五 2021-03-12 08:33:04 UTC
RTC time: 五 2021-03-12 16:33:05
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
- 同步网络时间
systemctl restart ntpd
ntpdate -dv ntp.api.bz (同步时间服务器,NTP服务器(上海) :ntp.api.bz)
可以获取ntp时间,但没有自动设置系统时间,是否要手动修改???
- 设置时区
查看时区:
1.timedatectl 中“Time zone”查看的就是目前系统所用的时区
2.date -R ,可以看到目前系统的时间与UTC时间的偏移值
[root@localhost rpmbuild]# date -R
Fri, 12 Mar 2021 16:58:47 +0800
3.ls -l /etc/localtime ,可以查看到目前使用的时区的配置文件
[root@localhost rpmbuild]# ls -l /etc/localtime
lrwxrwxrwx 1 root root 35 8月 15 2020 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
设置时区:
1.tzselect 按提示选择你想要使用的时区
根据提示将结果写到~/.bash_profile中,并执行 Africa/Abidjan'; export TZ
执行date -R ,发现时间发生了改变,但是timedatectl的localtime却没有改变,时区也没有发生改变,/etc/localtime也没有发生改变;所以这种方式并没有真正的设置
时区,但是可以常看你想要设置的时区与UTC的偏移值,然后手动创建/etc/localtime;
2.
[root@localhost ~]# rm /etc/localtime
rm:是否删除符号链接 '/etc/localtime'?y
[root@localhost ~]# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改时区成功!!
3.使用timedatectl命令设置时区
查看系统所有的时区:
[root@localhost ~]# timedatectl list-timezones |grep Africa/Abidjan
Africa/Abidjan
设置系统的时区:
timedatectl set-timezone Africa/Abidjan
查看/etc/localtime
[root@localhost ~]# ls -l /etc/localtime
lrwxrwxrwx 1 root root 36 3月 12 09:37 /etc/localtime -> ../usr/share/zoneinfo/Africa/Abidjan
修改成功!!!!
修改时区,/etc/localtime是根本,建议设置时间或时区最好使用timedatectl命令
- 设置时间标准
时间标准有localtime和UTC,时间的标准由操作系统来设定,windows默认使用localtime,macos默认使用utc而unix系列的操作系统两种都有
使用linux时最好将硬件时钟设置为UTC标准
可以通过timedatectl status 查看目前系统的时间标准
timedatectl set-local-rtc 1 可以将硬件时间设置为localtime
timedatectl set-local-rtc 0 可以将硬件时间设置为UTC时间
上述命令会自动生成/etc/adjtime,如果不存在/etc/adjtime,sysetmd会假定硬件时间按UTC设置。!!!
/etc/adjtime中也可以看出硬件时间的设置是localtime还是UTC
[root@localhost ~]# timedatectl set-local-rtc 0
[root@localhost ~]# cat /etc/adjtime
0.000000 1615540664 0.000000
1615540664
UTC
最能代表“真实时间”的是国际原子时钟),所有的时钟都是有误差的。电子时钟的时间是不准的,但是一般有固定的偏移。这种于基值的差称为“time skew”或“时间偏移”。用 hwclock 设置硬件时间时,会计算每天偏移的秒数。偏移值是原硬件时间与新设置硬件时间的差,并且考虑上次硬件时间设置时的偏移。新的偏移值会在设置时钟时写到文件 /etc/adjtime 。
注意: 如果硬件时间值与原值的差小于 24 小时,偏移量不会重新计算,因为时间过短,无法精确设置偏移。
如果硬件时钟总是过快或过慢,可能是计算了错误的偏移值。硬件时钟设置错误或者时间标准与其他操作系统不一致导致。删除文件 /etc/adjtime 可以删除偏移值,然后设置正确的硬件时钟和系统时钟,并检查时间标准是不是设置正确。
注意: 使用 Systemd 时,要使用 /etc/adjtime中的 drift 值(即无法或不想使用 NTP 时); 需要每次调用 hwclock --adjust命令,可以通过 cron 任务实现。
提高系统时间精度的方法有:
NTP 可以通过网络时间协议同步 Linux 系统的时间。NTP 也会修正中断频率和每秒滴答数以减少时间偏移。并且每隔 11 分钟同步一次硬件时钟。
建议硬件时间最好使用UTC,否则在启动或关机时时间会发生变化