• Long Live Kubernetes!
  • 可关注微信公众第一时间知晓网站动态。 微信公众号
  • Long Live Linux!
  • 您觉得本站非常有看点,可以收藏本站,本站将持续推出高质量文章!
  • This site has been created and is maintained by and is the sole property of Yok8s.com. No part of this site may be copied or reproduced without express written consent from the authors of this site.

Linux系统上的时间你搞懂了吗?

Centos Rocloong 2个月前 (10-24) 73次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

硬件时间(RTC time)

硬件时间简介

硬件时间,也被称为实时时钟(RTC),是指计算机主板上的一个独立于操作系统的设备,它在电源关闭甚至断电情况下也能保持运行。其功能是记录当前的日期和时间。

如何使用硬件时间

大部分操作系统在启动时会从RTC读取时间,然后设置系统时间。同样,操作系统也可以将系统时间写回到RTC中。在Unix和类Unix系统中,hwclock命令可以用来查询和设置RTC时间。例如:

# 查询硬件时间
hwclock --show
# 将系统时间设置为硬件时间
hwclock --systohc
# 将硬件时间设置为系统时间
hwclock --hctosys

在Windows系统中,可以通过日期和时间设置对话框或time命令查询和设置RTC时间。

系统时间(UTC时间)(Universal time)

系统时间简介

系统时间是计算机内部使用的时间,它通常在启动时从RTC设置,然后由系统时钟进行跟踪。系统时钟是操作系统内核的一部分,可以以毫秒或纳秒级别提供精确时间。

UTC时间

系统时间通常使用协调世界时(UTC)表示。UTC是一种基于原子时钟的时间标准,全球各地的科学家通过精密测量来维护它。它与格林尼治标准时间(GMT)非常接近,但不受地球自转速度变化的影响。在Unix和类Unix系统中,date命令可以用来查询和设置系统时间:

# 查询系统时间(UTC)
date -u

# 查询本地时间(由系统时间UTC和时区共同决定)
date

# 设置本地时间(后面那串是本地时间)(设置本地时间会同样设置系统时间,只不过会自动帮你做时区转换)
date -s "2024-10-24 00:00:00"

# 直接设置系统时间(不推荐,一般通过设置本地时间来设置系统时间,因为这样设置你还得把后面那串时间计算一下时区)
date -u -s "2024-10-23 00:00:00"

在Windows系统中,可以通过日期和时间设置对话框或time命令查询和设置系统时间。

本地时间(Local time)

本地时间简介

本地时间是系统时间经过时区转换后的时间。时区是根据地理位置确定的,全球分为24个时区,每个时区大约代表15度的经度。例如,北京时间是UTC+8,而伦敦时间是UTC+0。

如何使用本地时间

在Unix和类Unix系统中,date命令默认显示的是本地时间:

# 查询本地时间
date

在Windows系统中,日期和时间设置对话框或time命令默认显示的也是本地时间。

时区(Time zone)

时区简介

时区是为了方便统一时间而划分的地理区域。全球被划分为24个时区,每个时区大约代表15度的经度。各时区的时间以UTC(协调世界时)为基准,东边的时区比UTC时间晚,西边的时区比UTC时间早。

如何设置时区

在Unix和类Unix系统中,可以使用tzselect命令选择时区,然后将选定的时区链接到/etc/localtime:

# 选择时区
tzselect

# 设置时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

在Windows系统中,可以通过日期和时间设置对话框更改时区。

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,容器中的程序仍然能够获取到正确的物理时间。

然而,时区信息并不只是物理时间,它还涉及到逻辑时间的处理,包括日历计算、夏令时调整等等。这些信息是存储在 /etc/timezone 和 /etc/localtime 这两个文件中的。如果希望容器中的程序能够正确地处理这些时区相关的问题,那么需要将这两个文件同时挂载到容器中,缺一不可。

夏令时(Daylight Saving Time)(DST)

夏令时简介

夏令时是为了利用日照时间而在夏季调整时间的做法。通常情况下,夏令时会在春末将时间提前一小时,然后在秋初再把时间延后一小时。这样可以使人们在夜晚有更多的日光,从而节省电力。

夏令时地区

夏令时在全球范围内的采用情况并不统一,很多国家或地区都有自己特定的规定。

采用夏令时的地区

1、欧洲:大部分欧洲国家在每年3月的最后一个星期日开始夏令时,到10月的最后一个星期日结束。这包括英国、法国、德国、西班牙等国。

2、北美:包括美国(除了亚利桑那州和夏威夷)、加拿大(除了萨斯喀彻温省和一些地方)和墨西哥的一些地区。北美的夏令时从每年3月的第二个星期日开始,到11月的第一个星期日结束。

3、澳大利亚:只有南澳大利亚州、新南威尔士州、塔斯马尼亚州和维多利亚州实行夏令时,从每年10月的第一个星期日开始,到次年4月的第一个星期日结束。

不采用夏令时的地区:

1、中国:中国自1991年起就未再实行夏令时。

2、日本:日本自1952年以来就没有实行夏令时。

3、印度:印度没有实行夏令时。

4、亚利桑那州和夏威夷:这两个美国的地区不采用夏令时。

5、大部分非洲和南美洲国家:除了一些特定的国家或地区,大部分非洲和南美洲的国家都不实行夏令时。

如何处理夏令时

大多数现代操作系统和编程语言的时间库都可以自动处理夏令时。例如,在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系统中,只要正确设置了时区,系统就会自动处理夏令时。

timedatectl命令

在ubuntu里,可使用timedatectl查看以上相应概念:

root@ubuntu:~# timedatectl
               Local time: Thu 2024-10-24 17:38:04 CST
           Universal time: Thu 2024-10-24 09:38:04 UTC
                 RTC time: Thu 2024-10-24 09:38:05
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

释义:

1、Local time:本地时间。
2、Universal time:世界标准时间。
3、RTC time:Real Time Clock,硬件时钟,主板上由电池供电的BIOS时间,hwclock -r可查看。
4、System clock synchronized:系统时钟同步状态(yes表示系统时钟已同步)。
5、NTP service:NTP时钟同步服务。
6、RTC in local TZ:no表示硬件时钟设置为协调世界时(UTC),yes表示硬件时钟设置为本地时间。

命令示例

#3查看可用时区
timedatectl list-timezones
##设置时区
timedatectl set-timezone "Asia/Shanghai" 
##设置时间命令
timedatectl set-time YYYY-MM-DD 
timedatectl set-time 16:30:00
timedatectl set-time 2023-09-13
timedatectl set-time "2023-09-13 18:54:30"

##将硬件时钟设置为本地时间命令
timedatectl set-local-rtc 1
##将硬件时钟设置为UTC时间命令
timedatectl set-local-rtc 0

##启用网络时间同步
timedatectl set-ntp true
timedatectl set-ntp false

优缺点

优点:

简单易用:timedatectl 提供了简单易用的命令行接口,可以方便地设置系统时间和日期。
功能丰富:timedatectl 支持设置系统时区、时间、日期、硬件时钟等多种功能,满足了大多数用户的需求。
高效稳定:timedatectl 是系统自带的工具,稳定可靠,不会影响系统的稳定性和性能。
缺点:

需要 root 权限:timedatectl 需要 root 权限才能运行,普通用户无法直接使用该工具,降低了用户的操作权限。
依赖 systemd:timedatectl 是 systemd 工具的一部分,需要系统使用 systemd 作为 init 系统才能正常运行,不适用于所有 Linux 发行版。
可能影响系统时间:不正确地设置系统时间和日期可能导致系统出现各种问题,使用 timedatectl 需要谨慎操作。

未完待续。。。


《Linux系统上的时间你搞懂了吗?》版权归作者所有,如需转载请注明出处,并附带文章链接地址,侵权必究!!!
喜欢 (2)
[]
分享 (0)
Rocloong
关于作者:
善战者无赫赫战功!
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到