说说unix下的夏令时问题

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值