linux的那些事-时间 时区
时间表示:
用法:date [选项]... [+格式]
或:date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
以给定的格式显示当前时间,或是设置系统日期。
-d,--date=字符串 显示指定字符串所描述的时间,而非当前时间
-f,--file=日期文件 类似--date,从日期文件中按行读入时间描述
-r, --reference=文件 显示文件指定文件的最后修改时间
-R, --rfc-2822 以RFC 2822格式输出日期和时间
例如:2006年8月7日,星期一 12:34:56 -0600
--rfc-3339=TIMESPEC 以RFC 3339 格式输出日期和时间。
TIMESPEC=`date',`seconds',或 `ns'
表示日期和时间的显示精度。
日期和时间单元由单个的空格分开:
2006-08-07 12:34:56-06:00
-s, --set=字符串 设置指定字符串来分开时间
-u, --utc, --universal 输出或者设置协调的通用时间
--help 显示此帮助信息并退出
--version 显示版本信息并退出
给定的格式FORMAT 控制着输出,解释序列如下:
%% 一个文字的 %
%a 当前locale 的星期名缩写 (e.g., Sun)
%A 当前locale 的星期名全称 (e.g., Sunday)
%b 当前locale 的月名缩写 (e.g., Jan)
%B 当前locale 的月名全称 (e.g., January)
%c 当前locale 的日期和时间 (e.g., Wed 22 Nov 2017 04:43:20 PM CST)
%C 世纪;比如 %Y,通常为省略当前年份的后两位数字(例如:20)
%d 按月计的日期(例如:01)
%D 按月计的日期;等于%m/%d/%y e.g 11/22/17
%e 按月计的日期,添加空格,等于%_d
%F 完整日期格式,等价于 %Y-%m-%d
%g ISO-8601 格式年份的最后两位 (参见%G)
%G ISO-8601 格式年份 (参见%V),一般只和 %V 结合使用
%h 等于%b
%H 小时(00-23)
%I 小时(00-12)
%c 按年计的日期(001-366)
%k 时(0-23)
%l 时(1-12)
%m 月份(01-12)
%M 分(00-59)
%n 换行
%N 纳秒(000000000-999999999)
%p 当前locale 下的"上午"或者"下午",未知时输出为空
%P 与%p 类似,但是输出小写字母
%r 当前locale 下的 12 小时时钟时间 (如:11:11:04 下午)
%R 24 小时时间的时和分,等价于 %H:%M
%s 自UTC 时间 1970-01-01 00:00:00 以来所经过的秒数
%S 秒(00-60)
%t 输出制表符 Tab
%T 时间,等于%H:%M:%S
%u 星期,1 代表星期一
%U 一年中的第几周,以周日为每星期第一天(00-53)
%V ISO-8601 格式规范下的一年中第几周,以周一为每星期第一天(01-53)
%w 一星期中的第几日(0-6),0 代表周一
%W 一年中的第几周,以周一为每星期第一天(00-53)
%x 当前locale 下的日期描述 (如:12/31/99)
%X 当前locale 下的时间描述 (如:23:13:48)
%y 年份最后两位数位 (00-99)
%Y 年份
%z +hhmm 数字时区(例如,-0400)
%:z +hh:mm 数字时区(例如,-04:00)
%::z +hh:mm:ss 数字时区(例如,-04:00:00)
%:::z 数字时区带有必要的精度 (例如,-04,+05:30)
%Z 按字母表排序的时区缩写 (例如,EDT)
时间设置:
显示系统时间:date
显示硬件时间 :
hwclock --show
clock
Linux机器上的时间比较复杂,机器里有两个时钟,
硬件时钟(Real Time Clock,简称RTC)从根本上讲是CMOS时钟。
系统时钟 是由内核维护的。
系统时间=内核时间 硬件时间=CMOS时钟
在Linux下,默认情况下,系统时间和硬件时间,并不会自动同步。
在Linux运行过程中,系统时间和硬件时间以异步的方式运行,互不干扰。
硬件时间的运行,是靠Bios电池来维持。
而系统时间,是用CPU tick来维持的。
在系统开机的时候,会自动从Bios中取得硬件时间,设置为系统时间。
设置系统时间
# date -s“20120101 10:19"
(月/日/年 时:分:秒)
系统时钟 写入 硬件时钟:
# hwclock --systohc
或者
# clock --systohc
设置硬件时间
# hwclock --set --date="07/07/06 10:19" (月/日/年 时:分:秒)
# clock --set --date="07/07/06 10:19" (月/日/年 时:分:秒)
硬件时钟 写入 系统时钟:
# hwclock --hctosys
或者
# clock --hctosys
上面命令中,--hctosys表示Hardware Clock to SYStem clock。
为了保持系统时间与硬件时间的一致性,Linux每隔一段时间会将系统时间写入硬件。由于该同步是每隔一段时间(大约是11分钟)进行的,在执行完 date -s 命令后,如果马上重起系统,修改的时间就有可能没有被写入硬件。如果要确保修改生效,最好再使用 clock -w 这个命令将系统时间强行写入硬件。
再来说下clock -w这个命令
-w | --systohc set the hardware clock to the current system time 系统时间写入硬件时间
--systz set the system time based on the current timezone 设置系统时间基于当前时区
-s | --hctosys set the system time from the hardware clock 硬件时间设置入系统时间
设置完系统时间后,还需要同步到硬件时钟上
# clock --systohc
时区:
查看当前时区
date -R
选择时区
tzselect
(tzselect命令用于选择时区。要注意的是tzselect只是帮我们把选择的时区显示出来,并不会实际生效,也就是说它仅仅告诉我们怎么样去设置环境变量TZ。)(TZ = Time Zone)
更改时区
-
直接更改,复制相应的时区文件,替换系统时区文件;或者创建链接文件
cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
在中国可以使用:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
创建软连接
中国大陆
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
-
如果不知道时区,使用刚才的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
进行下面的操作
设定 TZ='Asia/Shanghai'; export TZ
# cp /usr/share/zoneinfo/$TZ /etc/localtime
重新启动或者运行时钟设置脚本使之发生作用
-
timeconfig可以直接更改时区
我的centos不支持此命令,暂无数据。但是我强烈推荐使用此命令
如果没有timeconfig命令,可以通过yum安装timeconfig:
yum install system-config-date
timeconfig是linux提供的一个图形化的配置根据,相对比较直观。
-
也可以通过网络确定时间
在日期与时间设置工具对话框中的下部,有一个“启用网络时间协议”的选项,将该项选中就可以使用网络时间协议来同步Linux 系统时钟。选中该项后,其下面的服务器下拉列表框就变为可用状态,可从中选择一个时间服务器作为远程时间服务器。然后单击确定按钮,便可连接所设定的时间服务器,并与之同步时间。
最后几点说明
- 时间保存在硬件实时钟(RTC)中,RTC由主板电池供电,即使关断电源也不会造成时间丢失
- 系统启动时从RTC获取时间,这个步骤在rc.sysinit中做
- UTC为true表示RTC保存的时间是UTC时间,false表示保存的是本地时间
- UTC是协调世界时UTC相当于本初子午线(即经度0度)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示.北京时间比UTC时间早8小时
- CST是美国中央时区的缩写。在部分unix操作系统版本里,有时也会代表China Standard Time,所以有时候会造成混淆