mktime和tm_isdst标志

时间:2012-05-10 11:46:48

标签: c++

我对tm结构中tm_isdst标志的使用存在以下疑问。根据手册页和Google搜索结果,我了解其值的解释如下

一个。值为0表示DST对于表示的时间

无效

B中。值为1表示DST有效

℃。值为-1会导致mktime检查DST是否生效。

这是令我困惑的第三点。我怀疑mktime是如何确定是否必须准确应用DST的。

例如

My Time Zone = GMT + 3:00
DST shifting = +1 Hour at 5:00 AM in January (to keep it simple)
Current UTC time = "01/Jan/2012 00:00:00"
UTC time in seconds time_t timetUTC = X seconds
Hence my time is = "01/Jan/2012 03:00:00"

随着时间的推移,我的时间价值会发生如下变化

"01/Jan/2012 04:00:00"            (X + 1 * 60 * 60)
"01/Jan/2012 05:00:00"            (X + 2 * 60 * 60)
"01/Jan/2012 05:59:59"            (X + 2 * 60 * 60 + 59)
"01/Jan/2012 05:00:00"            (X + 3 * 60 * 60)
"01/Jan/2012 06:00:00"            (X + 4 * 60 * 60)

根据我的理解

tm tmMyTime = localtime_r(X + 2 * 60 * 60) will set tmMyTime.tm_isdst to 0
tm tmMyTime = localtime_r(X + 3 * 60 * 60) will set tmMyTime.tm_isdst to 1

这样,即使tm结构的所有其他组件在两种情况下都相同, mktime(tmMyTime)可以返回正确的UTC值,具体取决于tm_isdst值。

现在,如果我设置tmMyTime.tm_isdst = -1,mktime会返回什么值?我读到了TZ变量,时间数据库等等。尽管如此,从逻辑上讲,mktime()如何判断是否对可能出现两次的tm值应用DST校正?

我们的时区没有DST。因此,我不太确定我的理解 是正确的。如果我错了,请纠正我。非常感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

简而言之:它取决于实现。

mktime通过检查区域设置来了解DST规则。

对于今年的大部分时间,mktime可以判断DST是否适用于特定的当地时间。当DST向后移动时,问题确实是“重复”小时(在你的例子中05:00:00 - 05:59:59)。对于此本地时间范围,给定tm_isdst = -1,mktime无法知道DST是否生效。选择哪一个,从一个实现到另一个实现不同。使用GNU版本的mktime,返回班次之前的UTC。

答案 1 :(得分:2)

tm_isdst通常不能解决模棱两可的时间。这是因为许多时区都有过渡(一次)而没有从dst跳到nodst,只是改变偏移和区域缩写。所以两次(转换前后)都有相同的tm_isdst。 切换夏季/冬季时,其他一些区域会更改tm_isdst,但不会更改缩写(例如澳大利亚/墨尔本)。

答案 2 :(得分:1)

我认为它会在一定程度上取决于您的平台。至少在Windows中,mktime()文档声明“C运行时库假定了美国实施夏令时计算的规则”,因此它有一个规则表,可以确定DST何时启动/在任何一年都结束了。

你很幸运没有DST在哪里。在我的世界,即实时数据采集和演示,DST是一个很大的麻烦!