理解时间:硬件时间、系统时间(UTC时间)、本地时间、时区与夏令时
处理和管理时间是计算机科学的重要方面,但也是最复杂和容易混淆的方面之一。本文将详细介绍硬件时间、系统时间(UTC时间)、本地时间、时区和夏令时,希望能帮助读者更好地理解这些概念。
1. 硬件时间(RTC time)
1.1 硬件时间简介
硬件时间,也被称为实时时钟(RTC),是指计算机主板上的一个独立于操作系统的设备,它在电源关闭甚至断电情况下也能保持运行。其功能是记录当前的日期和时间。
1.2 如何使用硬件时间
大部分操作系统在启动时会从RTC读取时间,然后设置系统时间。同样,操作系统也可以将系统时间写回到RTC中。
在Unix和类Unix系统中,hwclock
命令可以用来查询和设置RTC时间。例如:
# 查询硬件时间
hwclock --show
# 将系统时间设置为硬件时间
hwclock --systohc
# 将硬件时间设置为系统时间
hwclock --hctosys
在Windows系统中,可以通过日期和时间设置对话框或time
命令查询和设置RTC时间。
2. 系统时间(UTC时间)(Universal time)
2.1 系统时间简介
系统时间是计算机内部使用的时间,它通常在启动时从RTC设置,然后由系统时钟进行跟踪。系统时钟是操作系统内核的一部分,可以以毫秒或纳秒级别提供精确时间。
2.2 UTC时间
系统时间通常使用协调世界时(UTC)表示。UTC是一种基于原子时钟的时间标准,全球各地的科学家通过精密测量来维护它。它与格林尼治标准时间(GMT)非常接近,但不受地球自转速度变化的影响。
在Unix和类Unix系统中,date
命令可以用来查询和设置系统时间:
# 查询系统时间(UTC)
date -u
# 查询本地时间(由系统时间UTC和时区共同决定)
date
# 设置本地时间(后面那串是本地时间)(设置本地时间会同样设置系统时间,只不过会自动帮你做时区转换)
date -s "2022-01-01 00:00:00"
# 直接设置系统时间(不推荐,一般通过设置本地时间来设置系统时间,因为这样设置你还得把后面那串时间计算一下时区)
date -u -s "2022-01-01 00:00:00"
在Windows系统中,可以通过日期和时间设置对话框或time
命令查询和设置系统时间。
3. 本地时间(Local time)
3.1 本地时间简介
本地时间是系统时间经过时区转换后的时间。时区是根据地理位置确定的,全球分为24个时区,每个时区大约代表15度的经度。例如,北京时间是UTC+8,而伦敦时间是UTC+0。
3.2 如何使用本地时间
在Unix和类Unix系统中,date
命令默认显示的是本地时间:
# 查询本地时间
date
在Windows系统中,日期和时间设置对话框或time
命令默认显示的也是本地时间。
4. 时区(Time zone)
4.1 时区简介
时区是为了方便统一时间而划分的地理区域。全球被划分为24个时区,每个时区大约代表15度的经度。各时区的时间以UTC(协调世界时)为基准,东边的时区比UTC时间晚,西边的时区比UTC时间早。
4.2 如何设置时区
在Unix和类Unix系统中,可以使用tzselect
命令选择时区,然后将选定的时区链接到/etc/localtime
:
# 选择时区
tzselect
# 设置时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
在Windows系统中,可以通过日期和时间设置对话框更改时区。
4.3 docker容器中的时区(与宿主机日期时间同步)
Docker容器的默认时区取决于使用的基础镜像。许多常见的基础镜像(例如Debian,Ubuntu等)的默认时区通常是UTC(协调世界时)。这意味着如果没有在创建或运行Docker容器时显式设置一个特定的时区,那么容器内部的时间将按照UTC来显示。
如果希望docker容器中的时区与宿主机保持一致,可以在容器docker run的时候增加以下挂载:
-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
,容器中的程序仍然能够获取到正确的物理时间。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
ux运维知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
[外链图片转存中…(img-WtymX9dd-1712961627283)]