时间和时区 编辑 请登陆,再编辑

前言

一个操作系统通过如下内容确定时间:时间数值、时间标准、时区和夏令时调节(中国已经废止)。

基础概念

时钟分类

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) 。

  • UTC 是与时区无关的全球时间标准。尽管概念上有差别,UTC 和 GMT (格林威治时间) 是一样的。
  • localtime 标准则依赖于当前时区。

时间标准由操作系统设定,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 会在启动时导致某些莫名其妙的问题,往回设置系统时间一般都是不安全的。

RTC clock

实时时钟(Real-time clock,RTC)是指可以像时钟一様输出实际时间的电子设备,一般会是集成电路,因此也称为时钟芯片。

大部分操作系统的时间管理包括如下方面:

  • 启动时根据硬件时钟设置系统时间
  • 运行时通过 NTP 守护进程联网校正时间
  • 关机时根据系统时间设置硬件时间。

查看与设置

软件方式

打开控制中心-日期与时间,即可查看当前的日期与时间,并且进行简单的时间和时区设置 Time.png

命令方式

在 Linux 中,用于时钟查看和设置的命令主要有 date、hwclock 、 clock和timedatectl。

其中,clock 和 hwclock 用法相近,只用一个就行,只不过 clock 命令除了支持 x86 硬 件体系外,还支持 Alpha 硬件体系。

时间操作

timedatectl

语法:

timedatectl [选项.] {命令}

例 1:获得硬件时间和系统时间(硬件时钟按 localtime 显示),终端执行:

    timedatectl status

例 2:设置系统时间:

    timedatectl set-time "2012-10-30 18:17:16"
date

语法格式:

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/clock

语法格式:

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

显示时区

   $ date -R
   Thu, 17 Jun 2010 00:01:36 +0800
tzselect

设置时区

以下举例设置北京时间,终端执行:

   $ 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 [选项.] {命令}

例一:检查当前时区:

    timedatectl status

例二:显示可用时区:

    timedatectl list-timezones

例三:修改时区:

    timedatectl set-timezone <Zone>/<SubZone>

常见问题

禁止系统使用UTC时间

深度操作系统默认没有启用UTC时间,如果启用UTC时间,会与windows系统相差了8小时的时差

修改配置文件使Linux不使用UTC时间与Windows保持一致。

需要修改请终端执行:

    sudo gedit /etc/default/rcS

找到一行UTC=yes 把yes改为no,保存文件,重启生效.

使用 NTP 同步系统时间

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

相关链接

ubuntu中文百科:老旧文章/禁止系统日期时间设为UTC

Linux时间设置全攻略

Arch百科:time