Linux下系统时间函数、DST等相关问题总结

下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根据rule是否为-1来确定此时区是否实施了夏令时,若为-1,表明这个时区地已经实现了夏令时,则还需要经过去DST阶段,否则只需要经过去时区就可以得到UTC时间。

struct zone zones[N_ZONES] = {

/* offset rules */

{ -43200, -1 }, /* (GMT-12:00)International Date Line West */

{ -39600, -1 }, /* (GMT-11:00) Midway Island,Samoa */

{ -36000, -1 }, /* (GMT-10:00) Hawaii */

{ -32400,  0 }, /* (GMT-09:00) Alaska */

{ -28800,  0 }, /* (GMT-08:00) Pacific Time, Tijuana */

{ -25200, -1 }, /* (GMT-07:00) Arizona, Mazatlan*/

{ -25200, 13 }, /* (GMT-07:00) Chihuahua, La Paz*/

{ -25200,  0 }, /* (GMT-07:00) Mountain Time */

{ -21600,  0 }, /* (GMT-06:00) Central America */

{ -21600,  0 }, /* (GMT-06:00) Central Time */

{ -21600, 13 }, /* (GMT-06:00) Guadalajara, MexicoCity, Monterrey*/

{ -21600, -1 }, /* (GMT-06:00) Saskatchewan */

{ -18000, -1 }, /* (GMT-05:00) Bogota, Lima, Quito */

{ -18000,  0 }, /* (GMT-05:00) Eastern Time */

{ -18000, -1 }, /* (GMT-05:00) Indiana */

{ -14400,  0 }, /* (GMT-04:00) Atlantic Time */

{-14400, -1 }, /* (GMT-04:00) Caracas, La Paz */

{ -14400,  2 }, /* (GMT-04:00) Santiago */

{ -12600,  0 }, /* (GMT-03:30) Newfoundland */

{ -10800, 14 }, /* (GMT-03:00) Brasilia */

{ -10800, -1 }, /* (GMT-03:00) Buenos Aires, Georgetown*/

{ -10800, -1 }, /* (GMT-03:00) Greenland */

{ -7200, -1 }, /* (GMT-02:00) Mid-Atlantic */

{ -3600,  1 }, /* (GMT-01:00) Azores */

{ -3600, -1 }, /* (GMT-01:00) Cape Verde Is. */

{     0, -1 }, /* (GMT) Casablanca, Monrovia */

{     0,  1 }, /* (GMT) Greenwich MeanTime: Dublin, Edinburgh,Lisbon, London*/

{  3600,  1 }, /* (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna

{  3600,  1 }, /* (GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague */

{  3600,  1 }, /* (GMT+01:00) Brussels, Copenhagen, Madrid, Paris*/

{  3600,  1 }, /* (GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb*/

{  3600, -1 }, /* (GMT+01:00) West Central Africa*/

{  7200,  1 }, /* (GMT+02:00) Athens, Istanbul, Minsk */

{  7200,  1 }, /* (GMT+02:00) Bucharest */

{  7200,  4 }, /* (GMT+02:00) Cairo */

{  7200, -1 }, /* (GMT+02:00) Harare, Pretoria */

{  7200,  1 }, /* (GMT+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius */

{  7200,  5 }, /* (GMT+02:00) Jerusalem */

{ 10800,  6 }, /* (GMT+03:00) Baghdad */

{ 10800, -1 }, /* (GMT+03:00) Kuwait,Riyadh */

{ 10800,  7 }, /* (GMT+03:00) Moscow, St. Petersburg, Volgograd */

{ 10800, -1 }, /* (GMT+03:00) Nairobi*/

{ 12600,  8 }, /* (GMT+03:30) Tehran */

{ 14400, -1 }, /* (GMT+04:00) Abu Dhabi, Muscat */

{ 14400,  9 }, /* (GMT+04:00) Baku, Tbilisi, Yerevan */

{ 16200, -1 }, /* (GMT+04:30) Kabul*/

{ 18000,  7 }, /* (GMT+05:00)Ekaterinburg */

{ 18000, -1 }, /* (GMT+05:00) Islamabad, Karachi, Tashkent*/

{ 19800, -1 }, /* (GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi */

{ 20700, -1 }, /* (GMT+05:45) Kathmandu*/

{ 21600, 12 }, /* (GMT+06:00) Almaty, Novosibirsk */

{ 21600, -1 }, /* (GMT+06:00) Astana, Dhaka*/

{ 21600, -1 }, /* (GMT+06:00) Sri Jayawardenepura */

{  23400, -1 }, /* (GMT+06:30) Rangoon */

{ 25200, -1 }, /* (GMT+07:00) Bangkok, Hanoi, Jakarta*/

{ 25200,  7 }, /* (GMT+07:00) Krasnoyarsk */

{ 28800, -1 }, /* (GMT+08:00) Beijing,Chongquing, Hong Kong, Urumqi*/

{ 28800, -1 }, /* (GMT+08:00) Irkutsk,Ulaan Bataar */

{ 28800, -1 }, /* (GMT+08:00) Kuala Lumpur, Singapore*/

{ 28800, -1 }, /* (GMT+08:00) Perth*/

{ 28800, -1 }, /* (GMT+08:00) Taipei*/

{ 32400, -1 }, /* (GMT+09:00) Osaka, Sapporo, Tokyo*/

{ 32400, -1 }, /* (GMT+09:00) Seoul*/

{ 32400,  7 }, /* (GMT+09:00) Yakutsk */

{ 34200,  3 }, /* (GMT+09:30) Adelaide */

{ 34200, -1 }, /* (GMT+09:30) Darwin*/

{ 36000, -1 }, /* (GMT+10:00) Brisbane*/

{ 36000,  3 }, /* (GMT+10:00) Canberra, Melbourne, Sydney*/

{ 36000, -1 }, /* (GMT+10:00) Guam, Port Moresby */

{ 36000, 10 }, /* (GMT+10:00) Hobart*/

{ 36000,  7 }, /* (GMT+10:00) Vladivostok */

{ 39600, -1 }, /* (GMT+11:00) Magadan */

{ 39600,  7 }, /* (GMT+11:00)Solomon Is., New Caledonia*/

{ 43200, 11 }, /* (GMT+12:00) Auckland, Wellington */

{ 43200, -1 }, /* (GMT+12:00) Fiji,Kamchatka, Marshall Is. */

{ 43200, -1 }, /* (GMT+12:00) NZ */

};

那么又如何去掉DST,即找到系统时间与标准时间之间的DST偏移量呢?在此之前需要了解到DST的规则问题,如规则格式、规则数据等等。

DST规则规定了实施夏令时的起始时间以及结束时间,如澳大利亚的是:从4月的第一个星期天的凌晨3点到10月的第一个星期天的凌晨2点,全世界DST可参考www.worldtimezone.com/daylight.html。下面主要阐述如何判断目前的时间是否包含有夏令时。

rpytime(rule1, year) < (gm_time + zone->z_gmtoff))< rpytime(rule2, year)

上面的式子中gm_time是本地系统时间(注意是通过localtime获取,没有加入时区,单位为秒),z_gmtoff是指制定时区的偏移量,这样式子中间代表就是标准时间;式子中rule1,rule2分别对应于DST规则中的两个界点,并利用rpytime函数计算出从1970年以来的时间总长(以秒为单位),若上面的式子成立,表明存在DST,那是因为DST使得在标准时间之上提前了1小时。
---------------------
作者:chenlilong84
来源:CSDN
原文:https://blog.csdn.net/dragon_li_chen/article/details/7925667
版权声明:本文为博主原创文章,转载请附上博文链接!

Linux下系统时间函数、DST等相关问题总结(转)的更多相关文章

  1. linux下系统时间和时钟时间

    linux中有关系统时间.时钟时间的命令: 1显示系统时间的命令 ># date 2显示时钟时间的命令 ># clock或hwclock 3系统时间与互联网同步的命令 ># ntpd ...

  2. linux 下系统时间设置C语言实现

    #include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/time.h&g ...

  3. Linux下精确控制时间的函数

    Linux下精确控制时间的函数 在测试程序接口运行时间的时候,常用time,gettimeofday等函数,但是这些函数在程序执行的时候是耗费时间的,如果仅仅测试时间还行,但是如果程序中用到时间控制类 ...

  4. Linux下利用ioctl函数获取网卡信息

    linux下的ioctl函数原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv ...

  5. linux与php时间函数有关的错误解决

    最近在程序里写了不少获取时间或时间戳的函数date() strtotime()等,但是把程序拿到linux上运行却爆出这些函数的错误,具体原因是因为linux本身的时间设置以及php的时区问题. 先确 ...

  6. Windows与Linux/Mac系统时间不一致的解决方法

    Windows与Linux/Mac系统时间不一致的解决方法 分类: linux2012-02-12 14:25 1691人阅读 评论(1) 收藏 举报 windowsubuntusystemlinux ...

  7. 【C/C++】Linux下使用system()函数一定要谨慎

    [C/C++]Linux下使用system()函数一定要谨慎 http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为 ...

  8. Linux下设置时间

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

  9. 【转】在嵌入式Linux和PC机Linux下使用popen函数时,程序运行结果有差异。

    下面程序演示了在嵌入式Linux和PC机Linux下使用popen函数时,程序的运行结果是有差异的. 两个程序 atest.c 和 btest.c,atest 检查是否有 btest 进程运行,如果没 ...

随机推荐

  1. Docker-常用命令(7)

    ## List Docker CLI commandsdockerdocker container --help ## Display Docker version and infodocker -- ...

  2. Ai challenger 2017 image caption小结

    参加了今年的ai challenger 的image caption比赛,最终很幸运的获得了第二名.这里小结一下. Pytorch 越来越火了.. 前五名有三个pytorch, 两个tensorflo ...

  3. vs启动出错(chenlu-1):参数“basePath”不能是相对路径

    参数“basePath”不能是相对路径 原因: 1.调试路径下没有exe文件.没有生成exe文件. 2.项目属性->配置属性->调试->命令中的参数被设置为相对路径.

  4. 《Spring实战》学习笔记-第五章:构建Spring web应用

    之前一直在看<Spring实战>第三版,看到第五章时发现很多东西已经过时被废弃了,于是现在开始读<Spring实战>第四版了,章节安排与之前不同了,里面应用的应该是最新的技术. ...

  5. threding模块的其他用法

    import threading import time def func(n): time.sleep(0.5) n += 1 print(n, threading.current_thread() ...

  6. [LeetCode] Majority Element II 求大多数之二

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. Note: The a ...

  7. linux的基本操作(正则表达式)

    正则表达式 这部分内容可以说是学习shell脚本之前必学的内容.如果你这部分内容学的越好,那么你的shell脚本编写能力就会越强.所以不要嫌这部分内容啰嗦,也不要怕麻烦,要用心学习.一定要多加练习,练 ...

  8. Caused by: java.lang.ClassNotFoundException: Could not load requested class :XXX.XXX.XXX 异常处理

    在ssh整合中:出现的异常 Exception sending context initialized event to listener instance of class org.springfr ...

  9. Luogu 1031 - 均分纸牌 - [有意思的思维题]

    题目链接:https://www.luogu.org/problemnew/show/P1031 题目描述有 $N$ 堆纸牌,编号分别为 $1,2,…,N$.每堆上有若干张,但纸牌总数必为 $N$ 的 ...

  10. idea实用插件

    代码规范检测插件: Alibaba Java Coding GuideLines使用@data插件lombok数据库mapper插件mybatisX前端运行vue的插件,装起了后在Terminal上运 ...