我对tm结构中tm_isdst标志的使用存在以下疑问.根据手册页和Google搜索结果,我理解其值的解释如下
A.值为0表示DST对于表示的时间无效
B.值为1表示DST有效
C.值为-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"
Run Code Online (Sandbox Code Playgroud)
随着时间的推移,我的时间值会发生如下变化
"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)
Run Code Online (Sandbox Code Playgroud)
据我所知
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
Run Code Online (Sandbox Code Playgroud)
这样,即使tm结构的所有其他组件在两种情况下都相等,mktime(tmMyTime)也可以返回正确的UTC值,具体取决于tm_isdst值.
现在,如果我设置tmMyTime.tm_isdst = -1,mktime会返回什么值?我读到了TZ变量,时间数据库等等.尽管如此,从逻辑上讲,mktime()如何判断是否对可能出现两次的tm值应用DST校正?
我们的时区没有夏令时.因此,我不太确定我的理解是否正确.如果我错了,请纠正我.非常感谢您的帮助.
简而言之:它取决于实现.
mktime通过检查区域设置来了解DST规则.
对于今年的大部分时间,mktime可以判断DST是否适用于特定的当地时间.当DST向后移动时,问题确实是"重复"小时(在你的例子中05:00:00 - 05:59:59).对于此本地时间范围,给定tm_isdst = -1,mktime无法知道DST是否生效.选择哪一个,从一个实现到另一个实现不同.使用GNU版本的mktime,返回shift之前的UTC.