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
版权声明:本文为博主原创文章,转载请附上博文链接!
Linux下系统时间函数、DST等相关问题总结(转)的更多相关文章
- linux下系统时间和时钟时间
linux中有关系统时间.时钟时间的命令: 1显示系统时间的命令 ># date 2显示时钟时间的命令 ># clock或hwclock 3系统时间与互联网同步的命令 ># ntpd ...
- linux 下系统时间设置C语言实现
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/time.h&g ...
- Linux下精确控制时间的函数
Linux下精确控制时间的函数 在测试程序接口运行时间的时候,常用time,gettimeofday等函数,但是这些函数在程序执行的时候是耗费时间的,如果仅仅测试时间还行,但是如果程序中用到时间控制类 ...
- Linux下利用ioctl函数获取网卡信息
linux下的ioctl函数原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv ...
- linux与php时间函数有关的错误解决
最近在程序里写了不少获取时间或时间戳的函数date() strtotime()等,但是把程序拿到linux上运行却爆出这些函数的错误,具体原因是因为linux本身的时间设置以及php的时区问题. 先确 ...
- Windows与Linux/Mac系统时间不一致的解决方法
Windows与Linux/Mac系统时间不一致的解决方法 分类: linux2012-02-12 14:25 1691人阅读 评论(1) 收藏 举报 windowsubuntusystemlinux ...
- 【C/C++】Linux下使用system()函数一定要谨慎
[C/C++]Linux下使用system()函数一定要谨慎 http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为 ...
- Linux下设置时间
Linux下设置时间 提供两种最根本有效的方式,就是更改时区.这里以更改为国内上海时间例子,其他地方时区同理. 方法一 备份文件 mv /etc/localtime /etc/localtime.ba ...
- 【转】在嵌入式Linux和PC机Linux下使用popen函数时,程序运行结果有差异。
下面程序演示了在嵌入式Linux和PC机Linux下使用popen函数时,程序的运行结果是有差异的. 两个程序 atest.c 和 btest.c,atest 检查是否有 btest 进程运行,如果没 ...
随机推荐
- MyCat(一) - 初体验
前提: 1.安装JDK 2.安装MySQL 3.搭建了MySQL主从 1.下载MyCat,官网:http://www.mycat.io/ wget http://dl.mycat.io/1.6-REL ...
- IOS gallery
https://github.com/mengxianliang/XLCardSwitch
- Ubuntu系统安装nginx
1.首先查看linux系统 cat /proc/version Linux version 4.9.59-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (cr ...
- 算法提高 新建Microsoft Word文档
算法提高 新建Microsoft Word文档 时间限制:1.0s 内存限制:256.0MB 问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出 ...
- Matplotlib学习
决定通过一个个例子来实践并掌握Matplotlib.. 例子1. 画一个散点图,数据分布如下: import numpy as np import pandas as pd import matplo ...
- WdatePicker日历添加事件,在任意月改变时处理日期事件
原由 在做系统时根据要求有时候需要屏蔽掉某些特殊的日期,像周日或者法定假日,以及一些调班的日期:使用WdatePicker可以屏蔽掉周日和大多数法定假日,但像清明或者调班的日期则不好处理. 想法 1: ...
- python语法_算数运算+赋值运算符+比较运算符+逻辑运算符
算术运算符 + - * / 加减乘除 5/2 = 2.5 5//2 = 2 整除,地板除 5%2= 1 取余数 2**10 指数运算 2的10次方 算术优先级 无论多少级,都使用()小括号进行优先 ...
- 20175320 2018-2019-2 《Java程序设计》第4周学习总结
20175320 2018-2019-2 <Java程序设计>第4周学习总结 教材学习内容总结 本周学习了教材的第五章的内容.在这章中介绍了子类与继承,着重讲了子类继承的规则以及使用sup ...
- Web开发——jQuery基础
参考: 参考W3School:jQuery 教程 参考:jQuery 参考手册 参考(常用):jQuery API 测试 JavaScript 框架库 - jQuery 测试 JavaScript 框 ...
- Vue Watch 的原理 和 $nextTick() 通俗理解
网上watch和$nextTick()解释比较复杂,涉及到promise,h5的dom发生变化的新api等复杂代码,下列就是两个参考. [watch原理] [$nextTick()] 首先,看遇到问题 ...