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)

 

 

 

 

 

 

 

更改时区 

  1. 直接更改,复制相应的时区文件,替换系统时区文件;或者创建链接文件  
                    cp /usr/share/zoneinfo/$主时区/$次时区  /etc/localtime  
                 在中国可以使用:  
                    cp /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime 

                创建软连接
               中国大陆 
               ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime 

     
  2. 如果不知道时区,使用刚才的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 
               重新启动或者运行时钟设置脚本使之发生作用 

     
  3. timeconfig可以直接更改时区
    我的centos不支持此命令,暂无数据。但是我强烈推荐使用此命令 
    如果没有timeconfig命令,可以通过yum安装timeconfig:
    yum install system-config-date 
    timeconfig是linux提供的一个图形化的配置根据,相对比较直观。
     



     
  4. 也可以通过网络确定时间
     在日期与时间设置工具对话框中的下部,有一个“启用网络时间协议”的选项,将该项选中就可以使用网络时间协议来同步Linux 系统时钟。选中该项后,其下面的服务器下拉列表框就变为可用状态,可从中选择一个时间服务器作为远程时间服务器。然后单击确定按钮,便可连接所设定的时间服务器,并与之同步时间。


最后几点说明


 

  • 时间保存在硬件实时钟(RTC)中,RTC由主板电池供电,即使关断电源也不会造成时间丢失
  • 系统启动时从RTC获取时间,这个步骤在rc.sysinit中做
  • UTC为true表示RTC保存的时间是UTC时间,false表示保存的是本地时间
  • UTC是协调世界时UTC相当于本初子午线(即经度0度)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示.北京时间比UTC时间早8小时
  • CST是美国中央时区的缩写。在部分unix操作系统版本里,有时也会代表China Standard Time,所以有时候会造成混淆


 

posted @ 2017-10-10 21:52  乌托邦眺望  阅读(422)  评论(0编辑  收藏  举报