这个问题搞的我相当郁闷,本来我的文件是按批次输出,结果到了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
绝对是第一选择,让系统为您考虑夏令时是最明智的做法。