最近搞ONVIF,在时间接口中有一个时区的字段,需要使用POSIX格式的时区,ONVIF手册要求符合IEEE100.3.1的第8章节,但要注册才能看IEEE标准,我印象中以前下载过,但找不到了。幸好,找到一篇讲POSIX格式时区的文章,终于有点认知了。

一、理解POSIX格式时区

(本节主要根据上述地址的文章进行理解进行描述,不是直接翻译,建议直接看原文。)
Linux系统的环境变量TZ存储了时区信息,包括DST(Daylight Saving Time,日光节约时,又叫夏令时)的开、关,以及UTC(Coordinated Universal Time,世界协调时间)的时间差。系统内部均使用UTC时间,平常我们看到的时间(本地时间),都是基于时区和DST(夏令时)规则来计算得来的。TZ的格式为:

  1. 1
  1. TZ = local_timezone,date/time,date/time

local_timezone是时区名称,其后两个date/time分别表示DST变更时间点(即何时开始,何时结束),date格式为Mm.n.d(注:“M”是字符),其中m范围为1~12,表示1~12月份,如M3表示3月份;n范围为1~5,1表示一个月中第一周,5表示最后一周;d范围为0~6,0表示星期日,6表示星期六。time为hh:mm:ss的格式。 比如:

  1. 1
  1. TZ=CST6CDT,M3.2.0/2:00:00,M11.1.0/2:00:00

这个格式的时区表示:每一年的3月份第二个星期日凌晨2点开始变更为夏令时,11月份第1个星期日凌晨2点结束夏令时,CST6CDT为时区名称,CST表示Central Standard Time,CDT表示 Central Daylight Time,即夏令时,6表示与GMT相差6小时(实际为GMT -06:00,下文将看到)。关于时区名称,第二节再结合实例说讲讲。
夏令时格式可以自定义,但这不属于本文范围了。
查看tzset函数说明(使用命令man tzset),原文如下:

The value of TZ can be one of three formats. The first format is used when there is no day‐
light saving time in the local timezone:
std offset
The std string specifies the name of the timezone and must be three or more alphabetic charac‐
ters. The offset string immediately follows std and specifies the time value to be added to
the local time to get Coordinated Universal Time (UTC). The offset is positive if the local
timezone is west of the Prime Meridian and negative if it is east.
The hour must be between 0
and 24, and the minutes and seconds 0 and 59.

这部分说的是没有夏令时的时区格式,即一个名称加上与UTC的偏移值(时间差),如果时间差为正数,则时区位于本初子午线(Prime Meridian)之西(西几区),如果是负数,则时区位于本初子午线之东(东几区),见加粗部分字体。所以CST6CDT是西六区的时区名称。

二、实例

时区文件不一定全部是可读的ascii字符,大部分是乱码,但还是可以用cat命令查看得到有用信息,在一台PC上看看CST6CDT的实际情况:

  1. 1
    2
  1. root@latelee:~/test# cat /usr/share/zoneinfo/CST6CDT
    CST6CDT,M3.2.0,M11.1.0

注意,实际结果和上面举例不同之处是time,这表示是0点就进行。再看看用date命令得到的“时区名称”和时区偏移:

  1. 1
    2
    3
    4
  1. root@latelee:~/test# date +%Z
    CST
    root@latelee:~/test#date +%z
    -0600

可以看到,名称是“CST”,而不是“CST6CDT”,,时间比GMT晚6小时,即西六区,个人认为,第1节提到的名称,是很多有意义的字段组合而成。

再看一个太平洋时区的值:

大专栏  linux下时区的一些认识e>
  1. 1
    2
  1. root@latelee:~/test# cat /usr/share/zoneinfo/PST8PDT
    PST8PDT,M3.2.0,M11.1.0

除了时区名称不同,夏令时与CST6CDT相同。
类似的还有EST5EDT,实际,这几个名称上都是“X-ST-时区-X-DT”这个形式的。

回头看看北京时间(一般有北京、重庆、上海等地名,随便一个即可)的东八区:

  1. 1
    2
    3
    4
  1. root@latelee:~/test# cat /usr/share/zoneinfo/Asia/Shanghai
    CST-8
    root@latelee:~/test# date +%z
    +0800

可以看到,我们国家现在没有实行夏令时(历史上有短暂执行过)。我们再看看GMT-8的时区文件:

  1. 1
    2
    3
  1. root@latelee:~/test# cat /usr/share/zoneinfo/Etc/GMT-8
    TZif2pMT-8TZif2pMT-8
    -8

注意,是GMT-8是东八区的时区文件,而不是GMT+8,对于正负数,第一节是比较权威的解释,我们大概还可以这样认为:负数表示比GMT(注:本文不区别GMT和UTC)时间提前多少,正数表示比GMT时间落后多少。比如GMT-8,就是这个时区比GMT早了8个小时,GMT+8,就是这个时区比GMT晚了8个小时。比如现在写这篇文章时,我准备吃今天最后一餐饭了(没人请吃夜宵),伦敦那边才准备吃今天的午饭。
细心的读者会注意到,第1节出现了CST,而东八区时间里也有CST,我查了一下资料,CST表示下面4个时区:

  1. 1
    2
    3
    4
  1. Central Standard Time (USA) GMT-6:00
    Central Standard Time (Australia) GMT+9:30
    China Standard Time GMT+8:00
    Cuba Standard Time GMT-5:00

注:CST还是李迟个人主页“迟思堂工作室”的拼音首字母,也是李迟所学专业“计算机科学与技术”英文缩写。

三、其它

下面是使用zdump命令查看Shanghai时区文件的信息:

  1. 1
    2
    3
    4
    5
  1. root@latelee:~/test# zdump -v Asia/Shanghai
    Asia/Shanghai Fri Dec 13 20:45:52 1901 UT = Sat Dec 14 04:51:49 1901 LMT isdst=0 gmtoff=29157
    Asia/Shanghai Sat Dec 14 20:45:52 1901 UT = Sun Dec 15 04:51:49 1901 LMT isdst=0 gmtoff=29157
    Asia/Shanghai Sat Dec 31 15:54:02 1927 UT = Sat Dec 31 23:59:59 1927 LMT isdst=0 gmtoff=29157
    ........

暂时未研究这个。
当天的PS:
本来想再写一下RTC方面的东西,但我印象中有写过,我搜索了一下,果然有,但是,那是2年多以前的事了:嵌入式设备ntp同步时间的一些笔记–迟思堂工作室

四、参考资料

POSIX格式的时区介绍:http://www.ibm.com/developerworks/aix/library/au-aix-posix/index.html
GNU关于TZ变量的介绍:http://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
世界时区介绍、简写等:http://www.timeanddate.com/time/zones/

李迟 2016.1.18 周一 晚饭前

linux下时区的一些认识的更多相关文章

  1. GMT、UTC、PDT 时间是什么?Linux下如何调整时区

       今天碰到一个时区配置问题,如果服务器时区配置不对,很可能在使用date相关函数时会出现莫名其妙的错误,现将相关时区说明及LINUX下调整时区方法记录如下,以做备忘. GMT GMT 是 Gree ...

  2. linux环境下时区无法设置(UTC无法更改为CST)的问题解决

    在进行linux下修改时区的时候 总是修改不了 修改成 Asia/Shanghai  但是 时区总是 +0000 却不是想要的+0800 按照网上的方法 A方法:tzselect:执行tzselect ...

  3. Linux下使用timedatectl命令时间时区操作详解

    timedatectl命令对于RHEL / CentOS 7和基于Fedora 21+的分布式系统来说,是一个新工具,它作为systemd系统和服务管理器的一部分,代替旧的传统的用在基于Linux分布 ...

  4. 转载:Linux下查看/修改系统时区、时间

    一.查看和修改Linux的时区 1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 : "tzselect" ...

  5. [每日Linux]Linux下xsell和xftp的使用

    实验缘由: 1.xsell在Linux下的作用就是远程登录的一个界面,也就是实现访问在Windows下访问Linux服务器的功能.之前在数据挖掘实验中因为自己电脑的内存不够,曾经使用过实验室的服务器跑 ...

  6. Linux下ntpdate时间同步

    Linux下ntpdate时间同步 Ntp服务器配置(暂略,以后整理) 时间同步方法 同步命令               # ntpdate ntp服务器域名或IP           例:# nt ...

  7. Linux下查看内核、CPU、内存及各组件版本的命令和方法

    Linux下查看内核.CPU.内存及各组件版本的命令和方法 Linux查看内核版本: uname -a                        more /etc/*release       ...

  8. Linux下设置时间

    Linux下设置时间 提供两种最根本有效的方式,就是更改时区.这里以更改为国内上海时间例子,其他地方时区同理. 方法一 备份文件 mv /etc/localtime /etc/localtime.ba ...

  9. Linux下系统时间函数、DST等相关问题总结(转)

    Linux下系统时间函数.DST等相关问题总结 下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根 ...

随机推荐

  1. 可视化---seaborn

    变量说明 x,y,hue 数据集变量 变量名 date 数据集 数据集名 row,col 更多分类变量进行平铺显示 变量名 col_wrap 每行的最高平铺数 整数 estimator 在每个分类中进 ...

  2. POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]

    传送门:http://poj.org/problem?id=1845 大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有 ...

  3. SLAM资料

    当下SLAM方案的总体介绍 http://wwwbuild.net/roboteasy/908066.html slam基础知识 https://www.zhihu.com/question/3518 ...

  4. [前端] VUE基础 (6) (v-router插件、获取原生DOM)

    一.v-router插件 1.v-router插件介绍 v-router是vue的一个核心插件,vue+vue-router主要用来做SPA(单页面应用)的. 什么是SPA:就是在一个页面中,有多个页 ...

  5. systemd[1]: mariadb.service: Can't open PID file /data/mariadb/mysql/30-mariadb-1.pid (yet?) after start: No such file or directory

    环境:Centos8 编译安装Mariadb-10.4.11,安装到make install都没有问题,添加服务启动脚本到/lib/systemd/system/,服务启动脚本名为mariadb.se ...

  6. 前端之BOM与DOM-JQuery

    一.前端基础之BOM和DOM: 1: JavaScript分为 ECMAScript,DOM,BOM BOM:指的是浏览器对象模型,它使JavaScript有能力与浏览器进行“对话” DOM:是指文档 ...

  7. Opencv笔记(十二)——形态学转换

    学习目标: 学习不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等 我们要学习的函数有: cv2.erode(), cv2.dilate(), cv2.morphologyEx()等 原理简介: 形态 ...

  8. Opencv笔记(七)——访问与操作像素

    一.获取矩阵的元素 1.获取三维矩阵img[i,j]处的元素 (b,g,r) = image[i,j],image大小为:MxNxK. 2.获取三维矩阵的子矩阵的全部元素 newimage = ima ...

  9. idea新建maven项目后生成web.xml方法和添加到tomcat方法

    idea新建maven项目后生成web.xml方法和添加到tomcat方法 参考:https://www.cnblogs.com/Liang-Haishan216/p/9302141.html 1.首 ...

  10. G - Radar Scanner Gym - 102220G(中位数~~)

    zThere are n rectangle radar scanners on the ground. The sides of them are all paralleled to the axe ...