【Linux】服务器时区 [ CST | UTC | GMT | RTC ]
阿龙先生啊 2024-08-01 15:37:03 阅读 50
目录
1. 硬件时间(Real_TIME Clock [RTC time])
1.1 硬件时间简介
1.2 如何使用硬件时间
2. 系统时间(UTC时间)(Universal time)
2.1 系统时间简介
2.2 UTC时间
3. 本地时间(Local time)
3.1 本地时间简介
3.2 如何使用本地时间
4. 时区(Time zone)
4.1 时区简介
4.2 如何设置时区
4.3 docker容器中的时区(与宿主机日期时间同步)
5. 夏令时(Daylight Saving Time)(DST)
5.1 夏令时简介
5.2 夏令时地区
理解时间:硬件时间、系统时间(UTC时间)、本地时间、时区与夏令时
CST: 中国标准时间(China Standard Time),
UTC: 协调世界时,又称世界标准时间,简称UTC
GMT: 格林尼治标准时间(旧译格林威治平均时间或格林威治标准时间;英语:Greenwich Mean Time,GMT)
RTC:Real_TIME Clock 硬件时间
1. 硬件时间(Real_TIME Clock [RTC time])
1.1 硬件时间简介
硬件时间,也被称为实时时钟(RTC),是指计算机主板上的一个独立于操作系统的设备,它在电源关闭甚至断电情况下也能保持运行。其功能是记录当前的日期和时间。
1.2 如何使用硬件时间
大部分操作系统在启动时会从RTC读取时间,然后设置系统时间。同样,操作系统也可以将系统时间写回到RTC中。
在Unix和类Unix系统中,hwclock命令可以用来查询和设置RTC时间。例如:
<code># 查询硬件时间
hwclock --show
# 将系统时间设置为硬件时间
hwclock --systohc
# 将硬件时间设置为系统时间
hwclock --hctosys
2. 系统时间(UTC时间)(Universal time)
2.1 系统时间简介
系统时间是计算机内部使用的时间,它通常在启动时从RTC设置,然后由系统时钟进行跟踪。系统时钟是操作系统内核的一部分,可以以毫秒或纳秒级别提供精确时间。
2.2 UTC时间
系统时间通常使用协调世界时又称世界统一时间(UTC)表示。协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。
在Unix和类Unix系统中,date命令可以用来查询和设置系统时间:
<code>
# 查询系统时间(UTC)
date -u
# 查询本地时间(由系统时间UTC和时区共同决定)
date
# 设置本地时间(后面那串是本地时间)(设置本地时间会同样设置系统时间,只不过会自动帮你做时区转换)
date -s "2022-01-01 00:00:00"
# 直接设置系统时间(不推荐,一般通过设置本地时间来设置系统时间,因为这样设置你还得把后面那串时间计算一下时区)
date -u -s "2022-01-01 00:00:00"
3. 本地时间(Local time)
3.1 本地时间简介
本地时间是系统时间经过时区转换后的时间。时区是根据地理位置确定的,全球分为24个时区,每个时区大约代表15度的经度。例如,北京时间是UTC+8,而伦敦时间是UTC+0。
3.2 如何使用本地时间
在Unix和类Unix系统中,date命令默认显示的是本地时间:
# 查询本地时间
date
4. 时区(Time zone)
4.1 时区简介
时区是为了方便统一时间而划分的地理区域。全球被划分为24个时区,每个时区大约代表15度的经度。各时区的时间以UTC(协调世界时)为基准,东边的时区比UTC时间晚,西边的时区比UTC时间早。
4.2 如何设置时区
在Unix和类Unix系统中,可以使用tzselect命令选择时区,然后将选定的时区链接到/etc/localtime:
<code># 选择时区
tzselect
# 设置时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
4.3 docker容器中的时区(与宿主机日期时间同步)
Docker容器的默认时区取决于使用的基础镜像。许多常见的基础镜像(例如Debian,Ubuntu等)的默认时区通常是UTC(协调世界时)。这意味着如果没有在创建或运行Docker容器时显式设置一个特定的时区,那么容器内部的时间将按照UTC来显示。
如果希望docker容器中的时区与宿主机保持一致,可以在容器docker run的时候增加以下挂载:
<code>-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro\
/etc/timezone: 这个文件包含了当前设置的时区信息。比如,如果系统设置为美国东部时区,这个文件的内容可能会是 America/New_York。/etc/localtime: 这个文件是当前设定的时区对应的数据文件的复制品或者软链接。这个文件用于提供本地化的日期和时间显示。
这两个文件在系统中扮演着不同的角色,而且都是影响系统时间表现的重要因素。如果希望让Docker容器的时间与宿主机完全一致,那么在运行容器时需要同时挂载这两个文件:
docker run -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro your_image
只挂载 /etc/timezone 或 /etc/localtime 可能会导致一些问题,比如在处理跨时区的日期和时间时可能出现错误。
默认情况下,Docker容器并不会自动挂载 /etc/localtime 文件。容器是通过宿主机的内核获取物理时间的。
Docker容器虽然在很多方面都与宿主机隔离,但它们共享同一个内核。这意味着,当容器需要获取当前的物理时间(例如,调用 time() 系统调用)时,它会直接从宿主机的内核获取这个信息。这就是为什么即使不挂载 /etc/localtime,容器中的程序仍然能够获取到正确的物理时间。
然而,时区信息并不只是物理时间,它还涉及到逻辑时间的处理,包括日历计算、夏令时调整等等。这些信息是存储在 /etc/timezone 和 /etc/localtime 这两个文件中的。如果希望容器中的程序能够正确地处理这些时区相关的问题,那么需要将这两个文件同时挂载到容器中,缺一不可。
5. 夏令时(Daylight Saving Time)(DST)
5.1 夏令时简介
夏令时是为了利用日照时间而在夏季调整时间的做法。通常情况下,夏令时会在春末将时间提前一小时,然后在秋初再把时间延后一小时。这样可以使人们在夜晚有更多的日光,从而节省电力。
5.2 夏令时地区
夏令时在全球范围内的采用情况并不统一,很多国家或地区都有自己特定的规定。
采用夏令时的地区
欧洲:大部分欧洲国家在每年3月的最后一个星期日开始夏令时,到10月的最后一个星期日结束。这包括英国、法国、德国、西班牙等国。
北美:包括美国(除了亚利桑那州和夏威夷)、加拿大(除了萨斯喀彻温省和一些地方)和墨西哥的一些地区。北美的夏令时从每年3月的第二个星期日开始,到11月的第一个星期日结束。
澳大利亚:只有南澳大利亚州、新南威尔士州、塔斯马尼亚州和维多利亚州实行夏令时,从每年10月的第一个星期日开始,到次年4月的第一个星期日结束。
不采用夏令时的地区:
中国:中国自1991年起就未再实行夏令时。
日本:日本自1952年以来就没有实行夏令时。
印度:印度没有实行夏令时。
亚利桑那州和夏威夷:这两个美国的地区不采用夏令时。
大部分非洲和南美洲国家:除了一些特定的国家或地区,大部分非洲和南美洲的国家都不实行夏令时。
5.3 如何处理夏令时
大多数现代操作系统和编程语言的时间库都可以自动处理夏令时。例如,在Python中,pytz库提供了世界各地的时区数据,并可以自动处理夏令时:
from datetime import datetime
import pytz
# 获取当前的UTC时间
now = datetime.now(pytz.utc)
# 转换为纽约时间(自动处理夏令时)
ny_time = now.astimezone(pytz.timezone('America/New_York'))
print(ny_time)
同样,在Unix和类Unix系统中,只要正确设置了时区,系统就会自动处理夏令时。
Linux 硬件时间(RTC time)、系统时间(UTC时间、Universal time)、本地时间(Local time)、时区(Time zone)与夏令时(DST)解析-CSDN博客
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。