硬件时间(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 需要谨慎操作。
未完待续。。。