9

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

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"

随着时间的推移,我的时间值变化如下

"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 校正?

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

4

3 回答 3

6

简而言之:它依赖于实现。

mktime 通过检查语言环境来了解 DST 规则。

对于一年中的大部分时间,mktime 可以确定是否将 DST 应用于特定的本地时间。问题确实是 DST 向后移动的“重复”小时(在您的示例中为 05:00:00 - 05:59:59)。对于这个本地时间范围,给定 tm_isdst = -1,mktime 无法知道 DST 是否生效。选择其中哪一个,因一种实现方式而异。使用 GNU 版本的 mktime,将返回班次前的 UTC。

于 2012-05-13T13:41:57.570 回答
2

tm_isdst一般不能解决模棱两可的时代。那是因为许多时区都有转换(一次性)而没有从dstto跳转nodst,只是改变了偏移量和区域缩写。因此,两次(过渡前后)都具有相同的tm_isdst. 切换夏季/冬季时间时,其他一些区域会发生变化tm_isdst,但不会更改缩写(例如澳大利亚/墨尔本)。

于 2013-12-19T11:26:36.973 回答
1

我认为这将在某种程度上取决于您的平台。至少在 Windows 中,mktime() 文档指出“C 运行时库假定美国实施夏令时计算的规则”,因此它在某处有一个规则表,可以确定 DST 何时开始/在任何一年结束。

你很幸运,你所在的地方没有夏令时。在我的实时数据采集和呈现的世界里,夏令时是个大麻烦!

于 2012-05-10T18:37:25.750 回答