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

  • 相关阅读:
    免装版tomcat注册成windows系统服务方法
    IE下判断IE版本的语句...[if lte IE 8]……[endif]
    HTTP 消息结构
    RESTful API 设计指南
    Spring Cloud Alibaba Sentinel 流量卫兵
    SpringBoot 整合 ES 实现 CRUD 操作
    SpringBoot项目创建与第一个SSM项目示例
    SpringBoot整合邮件发送
    SpringBoot日志处理之Logback
    Java实现AES加密解密
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/10748588.html
Copyright © 2011-2022 走看看