zoukankan      html  css  js  c++  java
  • Linux下系统时间函数、DST等相关问题总结(转)

    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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Spring@Profile注解
    day 32 子进程的开启 及其用法
    day 31 udp 协议SOCK_DGRAM
    day 30 客户端获取cmd 命令的步骤
    day 29 socket 理论
    day 29 socket 初级版
    有关 组合 继承
    day 27 多态 接口 类方法 静态方法 hashlib 摘要算法模块
    新式类和经典类的区别
    day 28 hasattr getattr serattr delattr 和带__内置__ 类的内置方法
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/10748588.html
Copyright © 2011-2022 走看看