首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么mktime()需要了解夏令时?

问为什么mktime()需要了解夏令时?
EN

Stack Overflow用户
提问于 2017-11-16 14:44:57
回答 3查看 1.1K关注 0票数 2

因此,mktime()返回一个time_t值,该值定义为“一个整数值,表示自1970年1月1日世界协调时间1月1日00:00小时以来经过的秒数”(来源)。我可以使用time_t将日期转换为mktime()值。例如,要将日期10-9-2017 08:34:56转换为time_t,我将执行以下操作:

代码语言:javascript
复制
struct tm tm;
time_t tv;

tm.tm_sec = 56;
tm.tm_min = 34;
tm.tm_hour = 8;
tm.tm_mday = 10;
tm.tm_mon = 8;
tm.tm_year = 117;
tm.tm_isdst = ????;

tv = mktime(&tm);

现在我不明白的是tm_isdst参数背后的想法:它被描述为“指示夏时制时间在描述的时候是否为的标志”(来源)。

这种描述有点让我困惑,因为我认为,我在struct tm中描述的时间实际上已经是一个UTC时间,而我希望从mktime()获得的time_t值也是UTC。但是UTC的时间不会随着季节的变化而变化,那么为什么mktime()需要费心于夏令时呢?使用UTC而不是本地时间的好处,难道不是我不必费心于夏令时吗?那么,为什么我必须设置tm_isdst呢?

我相信答案真的很简单,但目前我没有看到它。请有人提供一个简单的例子,说明为什么mktime()需要tm_isdst参数将特定的日期和时间转换为time_t值?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-16 14:56:47

由于mktime使用当前时区来确定时间,因此DST是否有效地改变了时代的时间。

例如,如果我使用1/1/70 00:00:00填充tm,如下所示:

代码语言:javascript
复制
tm.tm_sec = 0;
tm.tm_min = 0;
tm.tm_hour = 0;
tm.tm_mday = 1;
tm.tm_mon = 0;
tm.tm_year = 70;
tm.tm_isdst = 0;

tv的值为18000,因为我的时区是GMT-5 (18000 = 3600 * 5)。如果我将tm_isdst的值更改为1,那么tv将被设置为14400 (3600 * 4)。

将tm_isdst设置为-1将查看本地时区数据库,以查看DST在给定日期/时间是否有效。

票数 6
EN

Stack Overflow用户

发布于 2017-11-16 15:07:39

现在我不明白的是tm_isdst参数背后的想法:它被描述为“指示夏时制在所描述的时间是否有效的标志”(源)。 这个描述有点让我困惑,因为我认为我用struct tm描述的时间实际上已经是一个UTC时间了

这是你的主要问题。根据您已经链接过的文档,mktime()将表示为本地时间的时间结构转换为time_t。

我希望从mktime()获得的time_t值也是UTC。

同样,根据文档,当time_t被解释为一个绝对时间时,它表示自UTC中的Epoch,经过的秒数,所以这确实是从mktime()获得的。但这意味着,在一般情况下,两者之间存在着时区和可能的夏时制差异。

C库依赖于适用于本地时间的时区的上下文本地化数据,但尽管它知道夏令时的当前规则,但它不一定知道在指定时间生效的规则。此外,在白天时间和标准时间之间的转换中也有边缘情况。由于这些原因,或者其他原因,您需要告诉mktime(),给定的时间是指夏令时还是标准时间。

但是UTC的时间不会随季节的变化而变化,那么mktime()为什么要费心于夏令时呢?

因为mktime()接受本地时间作为输入。

使用UTC而不是本地时间的好处,难道不是我不必费心于夏令时吗?

这是优势之一,是的。

那么,为什么我必须设置tm_isdst呢?

因为mktime()接受本地时间作为输入。

票数 2
EN

Stack Overflow用户

发布于 2017-11-16 16:25:19

struct tm可以被认为是时间戳。

例如:当一个时区从白天时间转到标准时间时,“一天”有25个小时,而struct tm需要的信息比“Y:m:s”更多。

当地时间可能是凌晨2:30,然后是1小时之后是标准时间2:30。.tm_isdst对区分这种情况特别有用。注意,.tm_isdst在所有时间戳中都是相关的。

由于struct tm本身不包含时区(该信息存在于其他地方),.tm_isdst的设计目的是提供标准时间或白天(甚至未知的标准/日光)的时间戳指示。

如果.tm_isdst设置为-1 (未知),且时区为UTC,那么对所有时间戳的期望都是.tm_isdst == 0。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47332528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档