Linux 时区设置


原文链接: Linux 时区设置

https://segmentfault.com/a/1190000005026503


UTC时间与北京时间的关系
GMT + 8 = UTC + 8 = CST
CST= UTC + 8 = GMT + 8 北京时间等于 UTC + 8 小时
CST:中国标准时间(China Standard Time) 等价于
UTC:世界标准时间(Universal Time/Temps Cordonn&eacute) + 8
GMT:格林尼治标准时间(Greenwich Mean Time) 等于UTC时间
PST是太平洋标准时间(西八区),与北京时间(东八区)时差-16个小时,也就是北京时间减去16就是PST时间。而PDT比PST早1个小时,就是说PDT与北京时间时差为-15小时
timedatectl

  Local time: Mon 2018-01-15 18:07:21 CST

Universal time: Mon 2018-01-15 10:07:21 UTC

    RTC time: Mon 2018-01-15 18:07:21
   Time zone: Asia/Shanghai (CST, +0800)
 NTP enabled: yes

NTP synchronized: yes
RTC in local TZ: yes

  DST active: n/a

世界的每个地区都有自己的本地时间,在Internet及无线电通信时,时间的统一非常重要!
整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信中,为统一而普遍使用一个标准时间,称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。UTC与GMT含义完全相同。

北京时区是东八区,领先UTC 8个小时,在电子邮件信头的Date域记为+0800。如果在电子邮件的信头中有这么一行:

   Date: Sun, 13 June 2010 09:45:28 +0800
说明信件发送地时间是2010年6月13号,星期日,上午9点45分28秒,该地区本地时领先UTC差 8个小时(+0800,就是东八区时间)。电子邮件信头的Date域使用24小时的时钟,而不使用AM和PM来标记上下午。
以这个电子邮件的发送时间为例,如果要把这个时间转化为UTC,可以使用以下公式: 
                   UTC + 时区差=本地时间
时区差东为正,西为负。为此,把东八区时区差记为 +0800,
  UTC + (+0800) = 本地(北京)时间    (1)

那么,UTC = 本地时间(北京时间))- 0800 (2)

                       0945 - 0800 = 0145
即UTC是当天凌晨1点45分28秒。若结果是负数就意味着是UTC前一天(即昨天),把这个负数加上2400就是UTC在前一天的时间。例如,本地(北京)时间是 0325 (凌晨3点25分),那么,UTC就是 0325 - 0800 = -0475,负号意味着是前一天, -0475 + 2400 = 1925,既前一天的晚上7点25分。
纽约的时区是西五区,比UTC落后五个小时,记为 -0500:
UTC +(-0500) = 纽约时间   (3)
UTC = 纽约时间 + 0500       (4)
把(2)式-(4)式 
UTC = 北京时间 - 0800 = 纽约时间 + 0500   (5) 
即 北京时间=纽约时间+ 1300              (6) 
即北京时间领先纽约时间十三个小时,由(6)式,
纽约时间 = 北京时间- 1300                 (7) 
重要的公式  UTC +时区差=本地时间
时区差东为正,西为负。例如,东八区(北京)是 +0800,西五区(纽约)是-0500,加州是西八区,是-0800,美国中部时区是西六区,-0600,美国山地时区是西七区,-0700,太平洋时区是西八区,-0800,在夏天使用夏时制,成为-0700。德国时区是东一区,+0100,夏天变为+0200。
多数电子邮件程序,例如Outlook Express,在显示时间时,计算机程序把时间先转换成为本地时间再显示,例如,邮件的Date域为:

Date: Sun, 13 June 2010 09:45:28 +0800
Outlook Express在显示时就显示为:
Date: Sat, 12 June 2010 08:45:28 pm,把北京时间转换成为了纽约时间,而且把二十四小时格式的时间转换成为了十二小时的格式。

linux 如何计算系统显示时间

  • 计算机上显示时间 locatetime
  • 硬件时间 就是主板上BIOS的RTC 时钟时间
  • 设置时区 [UTC] 就是伦敦时间 [PRC]是Asia/Shanghai别名 北京时间 可以通过tzselect进行设置
    Linux系统上显示的time总是通过系统上的timezone设置的

    如何保证windows和linux时间同步?

  • 设置显示时间为 本地时间(Local time) CST - sudo timedatectl set-local-rtc true

  • 硬件时间[RTC]为 本地时间(Local time) CST - hwclock --systohc --localtime # 将LOCAL时间存入RTC
    注意: RTC设为本地时间会有告警;
    因为硬件时钟不能保存时区和夏令时调整,修改后就无法从硬件时钟中读取出准确标准时间;不建议修改。

    在左边的导航菜单,导航到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
    在右边窗口,右键点击空白位置,然后选择 New >> DWORD(32 bit) Value。 RealTimeIsUniversal 并设置值为 1。

  1. 设置硬件[RTC]时间为(UTC) --adjust-system-clock 根据时钟时间设置显示时间
    timedatectl set-local-rtc 0 # 设置硬件时间为(UTC)
    ##等效命令
    hwclock --systohc --utc # 将UTC时间存入RTC
    hwclock --systohc --localtime # 将LOCAL时间存入RTC

  2. 设置时区 timezone /etc/timezone
    echo "Asia/Shanghai" > /etc/timezone
    timedatectl set-timezone UTC
    timedatectl set-timezone PRC
    timedatectl set-timezone Asia/Shanghai

  3. 设置本地时间localtime /etc/localtime

sudo dpkg-reconfigure -f noninteractive tzdata
等价 sudo DEBIAN_FRONTEND=noninteractive dpkg-reconfigure tzdata
等价 ln -snf /usr/share/zoneinfo/$TZ /etc/localtime

#
timedatectl list-timezones
timedatectl set-timezone “Asia/Kolkata”
timedatectl set-local-rtc 0
timedatectl set-ntp true === systemctl enable ntpd

2.设置日期与时间

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

################################################################################
最近在搞RTC,常用的两个命令式 date 和 hwclock。

date命令:操作内核时间(可以理解为软件时间)

#date -s 20110120        //设置本地日期为 2011年01月20号,这样会把具体时间设置成空00:00:00
#date -s 12:23:23        //设置本地时间,不会对日期做更改
#date -s "12:12:23 2011-01-20"   //设置日期和具体时间

hwclock命令:操作硬件RTC芯片时间(可以理解为硬件时间)

hwclock -r or hwclock --show           显示硬件时钟与日期
hwclock -s or hwclock --hctosys        将系统时钟调整为与目前的硬件时钟一致。
hwclock -w or hwclock --systohc        将硬件时钟调整为与目前的系统时钟一致。

功能说明:显示与设定硬件时钟。
    语法: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   显示版本信息

--------------------------- Linux时间相差8小时备忘录 -----------------------------------

一、内核启动时

内核先读取配置文件 /etc/sysconfig/clock 来确定RTC存的是LOCAL or UTC

vi /etc/sysconfig/clock

ZONE="Asia/Shanghai" # 本地时区
UTC=true # true表示RTC保存的时间是UTC时间,false表示保存的是本地时间
ARC=false # 参考hwclock的manpage
SRM=false

接着内核调用函数 rtc_systohc(),从RTC内读时间,并根据LOCAL or UTC来设置系统时间

二、hwclock设置RTC芯片

hwclock --systohc --utc # 将UTC时间存入RTC
hwclock --systohc --localtime # 将LOCAL时间存入RTC

hwclock --systohc
没有指定LOCAL or UTC,hwclock 根据配置来确定RTC里面存LOCAL orUTC
找配置文件的优先级顺序为:

$ADJTIME_PATH、/var/state/adjtime、/var/lib/hwclock/adjtime、/etc/adjtime

配置文件内有写LOCAL 或 RTC
没有配置文件的话,hwclock认为RTC里面存的是LOCAL

三、时区配置

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
########
I've been using the following script to set Ubuntu 14.04 servers to UTC timezone:

echo "Etc/UTC" > /etc/timezone
dpkg-reconfigure --frontend noninteractive tzdata
echo UTC=yes >> /etc/default/rcS

Now, in 16.04 it seems that I can configure everything with timedatectl. Now my script looks like:

timedatectl set-local-rtc 0   # 设置硬件时间为(UTC)
timedatectl set-timezone UTC  # 设置显示时间为 (UTC)
timedatectl set-ntp 1

timedatectl set-local-rtc 1   # 设置硬件时钟为本地时区(PRC)
timedatectl set-timezone PRC  # 设显示时间为中国区时间(UTC+8)
timedatectl

将你的硬件时钟设置为本地时区(PRC):

timedatectl set-local-rtc 1

将你的硬件时钟设置为协调世界时(UTC):

timedatectl set-local-rtc 0

将Linux系统时钟同步到远程NTP服务器

NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于同步计算机之间的系统时钟。timedatectl实用程序可以自动同步你的Linux系统时钟到使用NTP的远程服务器。

注意,你必须在系统上安装NTP以实现与NTP服务器的自动时间同步。

要开始自动时间同步到远程NTP服务器,在终端键入以下命令。

timedatectl set-ntp true

要禁用NTP时间同步,在终端键入以下命令。

timedatectl set-ntp false

只设置时间的话,我们可以使用set-time开关以及HH:MM:SS(小时,分,秒)的时间格式。

timedatectl set-time 15:58:30

7.只设置日期的话,我们可以使用set-time开关以及YY:MM:DD(年,月,日)的日期格式。

timedatectl set-time 20151120

8.设置日期和时间:

timedatectl set-time '16:10:40 2015-11-20'

通用协调时(UTC, Universal Time Coordinated) 与 格林尼治平均时(GMT, Greenwich Mean Time) 与北京时间的关系。
GMT=UTC
UTC+8=北京时间

UTC和GMT都是指的格林尼治标准时间,只不过UTC的称呼更为正式一点。两者的区别在于前者是一个天文上的概念,而后者是基于一个原子钟。在UTC中,每一年或两年会有一个“闰秒”,而我们一般不理 会这个“闰秒”,但是在Java中,这造成我们有时会出现60秒或61秒。
整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。在本文中,UTC与GMT含义完全相同。
北京时区是东八区,领先UTC八个小时,在电子邮件信头的Date域记为+0800。如果在电子邮件的信头中有这么一行:
Date: Fri, 08 Nov 2002 09:42:22 +0800
说明信件的发送地的地方时间是二○○二年十一月八号,星期五,早上九点四十二分(二十二秒),这个地方的本地时领先UTC八个小时(+0800, 就是东八区时间)。电子邮件信头的Date域使用二十四小时的时钟,而不使用AM和PM来标记上下午。

以这个电子邮件的发送时间为例,如果要把这个时间转化为UTC,可以使用一下公式:
UTC + 时区差 = 本地时间
时区差东为正,西为负。在此,把东八区时区差记为 +0800,
UTC + (+0800) = 本地(北京)时间 (1)
那么,UTC = 本地时间(北京时间))- 0800 (2)
0942 - 0800 = 0142
即UTC是当天凌晨一点四十二分二十二秒。如果结果是负数就意味着是UTC前一天,把这个负数加上2400就是UTC在前一天的时间。例如,本地(北京)时间是 0432 (凌晨四点三十二分),那么,UTC就是 0432 - 0800 = -0368,负号意味着是前一天, -0368 + 2400 = 2032,既前一天的晚上八点三十二分。
纽约的时区是西五区,比UTC落后五个小时,记为 -0500:
UTC + (-0500) = 纽约时间 (3)
UTC = 纽约时间 + 0500 (4)
把(2)式 - (4)式相比较,
UTC = 北京时间 - 0800 = 纽约时间 + 0500 (5)
即 北京时间 = 纽约时间 + 1300 (6)
即北京时间领先纽约时间十 三个小时,由(6)式,
纽约时间 = 北京时间 - 1300 (7)
在四月下旬,纽约又换用夏令时,又称为日光节约时,比标准纽约时间提前一个小时,实际成为西四区的标准时间,成为 -0400。
UTC + (-0400) = 纽约夏令时,套用以上公式,
北京时间 = 纽约夏令时 + 1200
纽约夏令时 = 北京时间 - 1200
在这些转换中,最重要的公式就是
UTC + 时区差 = 本地时间
时区差东为正,西为负。例如,东八区(北京)是 +0800,西五区(纽约)是-0500,加州是西八区,是-0800,美国中部时区是西六区,-0600,美国山地时区是西七区,-0700,太平洋时区是西八区,-0800,在夏天使用夏时制,成为-0700。德国时区是东一区,+0100,夏天变为+0200。
多数电子邮件程序,例如Outlook Express,在显示时间时,计算机程序把时间先转换成为本地时间再显示,例如,邮件的Date域为:
Date: Fri, 08 Nov 2002 09:42:22 +0800
Outlook Express在显示时就显示为:
Date: Thur, 07 Nov 2002 08:42:22 pm,把北京时间转换成为了纽约时间,而且把二十四小时格式的时间转换成为了十二小时的格式。当然,为了时间转换正确,发送方和接受方的计算机的时区都要设置正确,在这里,发送方的时区要正确地设为北京时区东八区,而我的时区要设为西五区。
为了方便起见,我在这里放上纽约,加洲以及北京实时显示的时钟,以省去计算的麻烦。

格林尼治标准时间(GMT,旧译“格林威治平均时间”或“格林威治标准时间”)是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。
理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。
地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用。现在的标准时间——协调世界时(UTC)——由原子钟提供。
自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息
中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8

时间以及时区设置

首先确认使用[UTC]还是local time.

  1. UTC(Universal Time Coordinated)=GMT(Greenwich Mean Time)
  2. Local time 是你手表上的时间

传统的POSIX计算机(Solaris,bsd,unix)使用UTC格式
linux可以处理UTC时间和蹩脚的Windows所使用的local time

到底是使用UTC还是local time可以这样来确定:
如果机器上同时安装有Linux和Windows,建议使用local time
如果机器上只安装有Linux,建议使用utc
确定后编辑/etc/sysconfig/clock, UTC=0 是local time; UTC=1 是UTC(GMT)

1) 使用cat /etc/sysconfig/clock查看当前时区
linux5:~ # cat /etc/sysconfig/clock

Path: System/Environment/Clock

Description: Information about your timezone and time

Type: string

ServiceRestart: boot.clock

#

Set to "-u" if your system clock is set to UTC, and to "--localtime"

if your clock runs that way.

#
HWCLOCK="-u"

Type: string(Europe/Berlin,Europe/London,Europe/Paris)

ServiceRestart: boot.clock

#

Timezone (e.g. CET)

(this will set /usr/lib/zoneinfo/localtime)

#
TIMEZONE="US/Pacific"
DEFAULT_TIMEZONE="US/Pacific"
linux5:~ #

2) 使用tzselect设置时区,最后结果如下

You can make this change permanent for yourself by appending the line

    TZ='Asia/Shanghai'; export TZ

to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai
linux5:~ #

3) 复制相应的时区文件,替换系统默认时区
linux5:~ # cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
linux5:~ #

4) 将当前时间写入BIOS永久生效(避免重启后失效)
linux5:~ # hwclock
Tue Jan 29 18:22:59 2008 -0.565688 seconds
linux5:~ #

  1. 配置ntp客户端
    编辑/etc/ntp.conf,增加一行server 10.30.1.10,其中10.30.1.105就是时钟服务器,如下
    linux:/var/log # grep -v # /etc/ntp.conf

server 10.30.1.105

查看ntp服务的状态
linux:/var/log # /etc/init.d/xntpd status
Checking for network time protocol daemon (NTPD): unused

设置时区以及时间
/usr/sbin/zic -l PRC
/bin/date "+%H:%M:%S - %d-%m-%Y"

写回硬件时钟
/sbin/hwclock --hctosys --localtime
或者写回硬件时钟: hwclock --systohc

在/etc/rc.d/rc5.d创建xntp服务的启动脚本
linux:/etc/rc.d/rc5.d # ln -s ../xntpd S14xntpd
查看ntp时间调整纪录
linux:/var/log # grep ntp messages
Aug 14 07:19:51 linux ntpdate[2837]: step time server 10.30.1.105 offset 2.010174 sec
Aug 14 07:19:51 linux ntpd[2884]: ntpd 4.2.0a@1.1213-r Wed Jun 30 18:37:03 UTC 2004 (1)
Aug 14 07:19:51 linux ntpd[2884]: precision = 1.000 usec
Aug 14 07:19:51 linux ntpd[2884]: Listening on interface wildcard, 0.0.0.0#123
Aug 14 07:19:51 linux ntpd[2884]: Listening on interface wildcard, ::#123
Aug 14 07:19:51 linux ntpd[2884]: Listening on interface lo, 127.0.0.1#123
Aug 14 07:19:51 linux ntpd[2884]: Listening on interface eth0, 10.40.157.66#123
Aug 14 07:19:51 linux ntpd[2884]: kernel time sync status 0040

mmscbill:~ # date
Wed May 7 15:53:10 CST 2008
这里时区设置没有错. PRC是时区的名称,它对应/usr/share/lib/zoneinfo下的PRC时区文件.
CST是Chinese Standard Time的缩写,用在date命令的输出中.它是定义在PRC时区文件中.看
一下/usr/share/lib/zoneinfo/src下的asia文件就知道是怎么回事了.

修改系统时间(bjchenxu,laixi781211,hutuworm)
date -s “2003-04-14 cst”,cst指时区,时间设定用date -s 18:10
修改后执行clock -w 写到CMOS
hwclock --systohc
set the hardware clock to the current system time

timedatectl命令对于RHEL / CentOS 7和基于Fedora 21+的分布式系统来说,是一个新工具,它作为systemd系统和服务管理器的一部分,代替旧的传统的用在基于Linux分布式系统的sysvinit守护进程的date命令。

timedatectl命令可以查询和更改系统时钟和设置,你可以使用此命令来设置或更改当前的日期,时间和时区,或实现与远程NTP服务器的自动系统时钟同步。

在本教程中,我要讲的是,如何在你的Linux系统上,通过使用来自于终端使用timedatectl命令的NTP,设置date、time、timezone和synchronize time来管理时间。

让你的Linux服务器或系统保持正确的时间是一个很好的实践,它有以下优点:

维护及时操作的系统任务,因为在Linux中的大多数任务都是由时间来控制的。
记录事件和系统上其它信息等的正确时间。

如何查找和设置Linux本地时区

1.要显示系统的当前时间和日期,使用命令行中的timedatectl命令,如下:

timedatectl status

在上面的示例中,RTC time就是硬件时钟的时间。

2.Linux系统上的time总是通过系统上的timezone设置的,要查看当前时区,按如下做:

timedatectl

OR

timedatectl | grep Time

3.要查看所有可用的时区,运行以下命令:

timedatectl list-timezones

4.要根据地理位置找到本地的时区,运行以下命令:

timedatectl list-timezones | egrep -o “Asia/B.*”

timedatectl list-timezones | egrep -o “Europe/L.*”

timedatectl list-timezones | egrep -o “America/N.*”

5.要在Linux中设置本地时区,使用set-timezone开关,如下所示。

timedatectl set-timezone “Asia/Kolkata”

推荐使用和设置协调世界时,即UTC。

timedatectl set-timezone UTC

你需要输入正确命名的时区,否者在你改变时区的时候,可能会发生错误。在下面的例子中,由于 “Asia/Kalkata” 这个时区是不正确的,因此导致了错误。

如何在Linux中设置时间和日期

6.你可以使用timedatectl命令,设置系统上的日期和时间,如下所示:

设置Linux中的时间

只设置时间的话,我们可以使用set-time开关以及HH:MM:SS(小时,分,秒)的时间格式。

timedatectl set-time 15:58:30

在Linux中设置日期

7.只设置日期的话,我们可以使用set-time开关以及YY:MM:DD(年,月,日)的日期格式。

timedatectl set-time 20151120

8.设置日期和时间:

timedatectl set-time '16:10:40 2015-11-20'

如何在Linux中查找和设置硬件时钟

9.要设置硬件时钟以协调世界时,UTC,可以使用 set-local-rtc boolean-value选项,如下所示:

首先确定你的硬件时钟是否设置为本地时区:

timedatectl | grep local

将你的硬件时钟设置为本地时区:

timedatectl set-local-rtc 1

将你的硬件时钟设置为协调世界时(UTC):

timedatectl set-local-rtc 0

将Linux系统时钟同步到远程NTP服务器

NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于同步计算机之间的系统时钟。timedatectl实用程序可以自动同步你的Linux系统时钟到使用NTP的远程服务器。

注意,你必须在系统上安装NTP以实现与NTP服务器的自动时间同步。

要开始自动时间同步到远程NTP服务器,在终端键入以下命令。

timedatectl set-ntp true

要禁用NTP时间同步,在终端键入以下命令。

timedatectl set-ntp false

总结

本教程中描述的都是一些非常简单的例子,希望它们能对你设置各种Linux系统时钟和时区有帮助。有不同的看法,也请不吝指教。

译文链接:http://www.codeceo.com/article/linux-timedatectl-set-time.html
英文原文:How to Set Time, Timezone and Synchronize System Clock Using timedatectl Comman

`