添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
坏坏的保温杯  ·  Mysql ...·  1 年前    · 
逆袭的红酒  ·  用 preload ...·  1 年前    · 
爱旅游的汽水  ·  灰度图上用opencv ...·  1 年前    · 

Linux上的mktime行为令人困惑?

5 人关注

我正在使用Suse 10中的mktime(struct tm*)函数。

现在,我注意到在启用日光节约时间时的一些奇怪行为。比方说,我已经启用了夏令时,在9月15日18:10开始,夏令时的校正时间为30分钟。现在,当我用日期为9月15日18:10的tm结构调用mktime,并且tm_isdst被设置为0时,我在tm结构中得到相同的值,只是tm_isdst被设置为1。

但是,如果把日期传成9月15日18:10,tm_isdst设置为1,那么我发现时间变成了17:40。在9月15日18:10至9月15日18:40之间的时间,tm结构中的这种修正被注意到了,但在那之后,时间的修正没有发生,而且dst标志仍然被启用。即使我把日期定为9月16日18:10,也没有发生时间修正,只有dst标志保持启用状态。

我完全糊涂了。这就是Mktime的正确行为吗?

c
linux
mktime
datetime
Jay
Jay
发布于 2011-09-16
2 个回答
Dmitri
Dmitri
发布于 2011-09-16
已采纳
0 人赞同

如果当地时间因夏令时而改变30分钟,那么每年就有30分钟的当地时间发生两次(一次是夏令时,一次是不发生),另外30分钟则是 never 发生(当时间改变时,它会被跳过)。

因此,在时钟被调回的30分钟内的当地时间是不明确的,除非指定DST是否生效;有两个实际的时间时刻,它们可能对应于。

在时钟被提前设置的30分钟内的当地时间是无效的;它们没有实际的时间点可以对应(尽管转换仍然可以通过假设DST生效或不生效来完成)。

因此,对于一些本地时间(忽略夏令时状态),可能有不止一个对应的UTC时间,但对于任何给定的UTC时间,只有一个可能的本地时间(如果夏令时调整被正确计算的话)。

当你调用 mktime 时,它正在将你给它的本地时间转换为一个time_t,就像DST生效或不生效一样,取决于 tm_isdst 的值。 你得到的修正值是基于这个转换的反面,系统会根据它对转换时的夏令时是否生效的想法,来决定你得到的是夏令时还是非夏令时的时间。 你给它的时间和你得到的时间实际上代表了同一时刻的时间,但由于不同的夏令时状态,与UTC的偏移量不同。

所以是的,这是 mktime 的正确行为。 它应该根据它对如何正确表示你给它的时间的想法来规范结构中的值。

这也说明了为什么使用本地时间追踪实际事件时要小心 -- 如果DST状态或与UTC的偏移量没有和时间一起保存,一些本地时间值可能是模糊的。