现在的位置: 首页 > 综合 > 正文

说说unix下的夏令时问题

2013年07月11日 ⁄ 综合 ⁄ 共 1417字 ⁄ 字号 评论关闭

这个问题搞的我相当郁闷,本来我的文件是按批次输出,结果到了5分钟,文件还没输出,我开始以为是程序配置错误了,把其他省份的正确配置拿过来完全的一样的搞还是不行。接着开始查代码,以为系统不同,用oslevel -r来看结果版本都是AIX 5300,这些可纳闷,在另外一个同样的机器上能正确运行,在这里却不行,然后一步步跟踪,结果就发现到了mktime函数转换时间时出问题了,转换前后正好差了一个小时。发现了问题就好解决了.

 

说说这个
tm_isdst
的其中一个取值,
-1

-1

man
手册上的描述是,【
negative if the information is not
available.

】翻译成中文【
如果信息不可用,则
tm_isdst
值为负。
】,这个学问可大了,有很多人看到这句话就认为一旦设定成
-1
的话这个
tm
就无可救药啦,是个残废。真的是这样么?实际上这个值时可以通过时区逆推出来的,时区结构体里包含这个信息

struct
timezone {

int
tz_minuteswest; /*

グリニッジ標準時との差
(
西方に分単位
) */

int tz_dsttime;
/*
夏時間調整の型
*/

};

事实上
mktime
就是这么干的,由于我没看代码,是不是由
timezone结构体
推出我不清楚,但是有一点是确认的,
mktime
是可以推测这个
tm_isdst
到底应该为几的。

我们来具体看看
mktime
怎么做的:

无论你传入的
tm
结构体中的
tm_isdst
到底为几(
1

0

-1
),
mktime
都会根据你传入的
tm
结构体所对应的时间结合当前系统(用户?)的时区来判定
tm_isdst
应该是几并重写到参数
tm

tm_isdst
成员中去。似乎不存在不能判定的情况,所以
mktime
调用之后应该不会存在
-1
的情况。

关于
tm_isdst
的奥妙就此先告一段落,下面讨论一下设
1

0

-1
的时候
mktime
到底是怎么计算时间的。

先说
0
,完全不考虑夏令时的问题,直接计算
日历时间
(秒数那种,术语不会说)。比如系统时区
GMT-5

日期任意,时间
12

00

mktime
算出来的时间就是GMT时间
17

00
相当的秒数时间


后说1,完全考虑夏令时,请注意,这里容易产生歧义,所谓【完全考虑夏令时】是指滥好人那种,只要你系统时区处于夏令时执行时区范围内(美国,加拿大,德
国……),恭喜你,你说传入的任何时间都会被夏令时话,也是就是一年四季您都生活在夏令时中。还举上面的例子,日期仍旧无关,

12

00
,算出来的时间可是
16

00
相当的时间哟。当然,如果你活在伟大的祖国的话,
1
的效果和
0
的效果没有区别,您永远不比担心这个值会影响计算结果的误差。

最后说
-1
,最智能的选项,同时也是您最明智的选择。在这个时候,系统会为您算出最正确的值。

铺开~铺开~ 

非夏令时执行时区自然不说,GMT
+8
的时间
12

00
永远会被正确的算出
GMT 4

00
的完美数值。

夏令时执行时区的话,夏令时会被自动计算。再铺之~

GMT-5
,参数时间为
2008/06/01 12:00,
算出来的秒数时间是多少
?16:00
相当!
mktime
函数自动考虑夏令时,把快的一小时减掉了。(此时间为夏令时有效时间)

GMT-5
,参数时间为
2008/06/01 12:00,
算出来的秒数时间是多少
?
如你所料,
17

00
相当。
mktime
函数看到参数时间不属于夏令时范围之内,不会调整这个一小时。

 

由此可见,
-1
绝对是第一选择,让系统为您考虑夏令时是最明智的做法。

抱歉!评论已关闭.