一个操作系统通过如下内容确定时间:时间数值、时间标准、时区和夏令时调节(中国已经废止)。
Linux 时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称 RTC)时钟。
主板上由电池供电的时钟,这个硬件时钟可以在BIOS 中进行设置。仅能保存:年、月、日、时、分、秒这些时间数值,无法保存时间标准(UTC 或 localtime)和是否使用夏令时调节。
当前 Linux Kernel 中的时钟,当 Linux 启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。Linux 中的所有命令(包括函数)都是采用的系统时钟设置。才系统时钟保存了:时间、时区和夏令时设置。Linux 内核保存为自 UTC 时间 1970 年1月1日经过的秒数。初始系统时钟是从硬件时间计算得来,计算时会考虑/etc/adjtime的设置。系统启动之后,系统时钟与硬件时钟独立运行,Linux 通过时钟中断计数维护系统时钟。
因为系统时间是按 32 为整数保存的,最大只能记到 2038 年,所以 32 位 Linux 系统将在 2038 年停止工作。
时间表示有两个标准:localtime 和 UTC(Coordinated Universal Time) 。
时间标准由操作系统设定,Windows 默认使用 localtime,Mac OS 默认使用 UTC 而 UNIX 系列的操作系统两者都有。使用 Linux 时,最好将硬件时钟设置为 UTC 标准,并在所有操作系统中使用。这样 Linux 系统就可以自动调整夏令时设置,而如果使用 localtime 标准那么系统时间不会根据夏令时自动调整。
通过如下命令可以检查当前设置,终端执行:
timedatectl status | grep local
硬件时间可以用 hwclock 命令设置,将硬件时间设置为 localtime,终端执行:
timedatectl set-local-rtc 1
硬件时间设置成 UTC,终端执行:
timedatectl set-local-rtc 0
上述命令会自动生成/etc/adjtime,无需单独设置。
系统启动装入 rtc 驱动时可能会根据系统时钟设置硬件时钟。是否设置依赖于平台、内核版本和内核编译选项。如果进行了设置,此时会假定硬件时钟为 UTC 标准,/sys/class/rtc/rtcN/hctosys(N=0,1,2,..) 会设置成 1。后面 Upstart 会根据/etc/adjtime重新设置。所以讲硬件时间设置为 localtime 会在启动时导致某些莫名其妙的问题,往回设置系统时间一般都是不安全的。
实时时钟(Real-time clock,RTC)是指可以像时钟一様输出实际时间的电子设备,一般会是集成电路,因此也称为时钟芯片。
大部分操作系统的时间管理包括如下方面:
打开控制中心-日期与时间,即可查看当前的日期与时间,并且进行简单的时间和时区设置 Time.png
在 Linux 中,用于时钟查看和设置的命令主要有 date、hwclock 、 clock和timedatectl。
其中,clock 和 hwclock 用法相近,只用一个就行,只不过 clock 命令除了支持 x86 硬 件体系外,还支持 Alpha 硬件体系。
语法:
timedatectl [选项.] {命令}
例 1:获得硬件时间和系统时间(硬件时钟按 localtime 显示),终端执行:
timedatectl status
例 2:设置系统时间:
timedatectl set-time "2012-10-30 18:17:16"
语法格式:
date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help]
[--version] [+FORMAT] [MMDDhhmm[[CC]YY][.ss]]
说明:可用来设置系统日期与时间。只有管理员才有设置日期与时间的权限,一般用户只能用date 命令显示时间。
若不加任何参数,data 会显示目前的日期与时间。
例 1:显示当前系统时间
$ date
2010 年 06 月 17 日 星期四 00:00:04 CST
例 2:设置日期和时间为 2010 年 6 月 18 号 12:00
$ date -s "20100618 12:00:00"
2010 年 06 月 18 日 星期五 12:00:00 CST
例 3:设置日期为 2010 年年 6 月 18 号
$ date -s 20100618
2010 年 06 月 18 日 星期五 00:00:00 CST
例 4:设置时间为 12:00:00
$ date 12:00:00
date: invalid date “12:00:00”
语法格式:
hwclock [--adjust][--debug][--directisa][--hctosys][--show][--systohc][--test]
[--utc][--version][--set --date=<日期与时间>]
参数:
--adjust hwclock 每次更改硬件时钟时,
都会记录在/etc/adjtime 文件中。
使用--adjust 参数,
可使 hwclock
根据先前的记录来估算硬件时钟的偏差,并用来校正目前的硬件时钟。
--debug 显示 hwclock 执行时详细的信息。
--directisa hwclock 预设从/dev/rtc 设备来存取硬件时钟。若无法存取时,可用此参数直接以 I/O 指令
来存取硬件时钟。
--hctosys 将系统时钟调整为与目前的硬件时钟一致。
--set --date=<日期与时间> 设定硬件时钟。
--show 显示硬件时钟的时间与日期。
--systohc 将硬件时钟调整为与目前的系统时钟一致。
--test 仅测试程序,而不会实际更改硬件时钟。
--utc 若要使用格林威治时间,请加入此参数,hwclock 会执行转换的工作。
--version 显示版本信息。
例 1:查看硬件时间
hwclock --show
或者
clock --show
例 2:设置硬件时间
hwclock --set --date="07/07/06 10:19" (月/日/年 时:分:秒)
或者
clock --set --date="07/07/06 10:19" (月/日/年 时:分:秒)
例 3:硬件时间和系统时间的同步 按照前面的说法,重新启动系统,硬件时间会读取系统时间,实现同步,但是在不重新启动的时候,需要用 hwclock 或 clock命令实现同步。 硬件时钟与系统时钟同步:
hwclock --hctosys(hc 代表硬件时间,sys 代表系统时间)
或者
clock –hctosys
例 4:系统时钟和硬件时钟同步:
hwclock --systohc
或者
clock –systohc
例 5:强制将系统时间写入 CMOS,使之永久生效,避免系统重启后恢复成原时间
clock –w
或者
hwclock -w
显示时区
$ date -R
Thu, 17 Jun 2010 00:01:36 +0800
设置时区
以下举例设置北京时间,终端执行:
$ 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) east China - Beijing, Guangdong, Shanghai, etc.2) Heilongjiang
3) central China - Gansu, Guizhou, Sichuan, Yunnan, etc.
4) Tibet & most of Xinjiang Uyghur
5) southwest Xinjiang Uyghur
$? 输入 1,北京时间
The following information has been given:
China
east China - Beijing, Guangdong, Shanghai, etc.
Therefore TZ='Asia/Shanghai' will be used.
Local time is now:
Fri Jul 7 10:32:18 CST 2006.
Universal Time is now: Fri Jul 7 02:32:18 UTC 2006.
Is the above information OK?
1) Yes
2) No
$? 输入 1,确认
语法:
timedatectl [选项.] {命令}
例一:检查当前时区:
timedatectl status
例二:显示可用时区:
timedatectl list-timezones
例三:修改时区:
timedatectl set-timezone <Zone>/<SubZone>
深度操作系统默认没有启用UTC时间,如果启用UTC时间,会与windows系统相差了8小时的时差
修改配置文件使Linux不使用UTC时间与Windows保持一致。
需要修改请终端执行:
sudo gedit /etc/default/rcS
找到一行UTC=yes 把yes改为no,保存文件,重启生效.
Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。
安装 ntp,只需在终端输入以下命令:
sudo apt-get install ntp
安装后,NTP 即可正常工作,如何您需要配置 NTP 则按需编辑 /etc/ntp.conf 配置文件:
sudo vi /etc/ntp.conf
配置完毕后,只需重启 ntp 服务:
sudo service ntp restart
检查 NTP 服务是否在同步:
sudo ntpq -c lpeer
查看同步日志:
sudo tail -f /var/log/syslog