因此,mktime()返回一个time_t值,该值定义为“一个整数值,表示自1970年1月1日世界协调时间1月1日00:00小时以来经过的秒数”(来源)。我可以使用time_t将日期转换为mktime()值。例如,要将日期10-9-2017 08:34:56转换为time_t,我将执行以下操作:
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值?
发布于 2017-11-16 14:56:47
由于mktime使用当前时区来确定时间,因此DST是否有效地改变了时代的时间。
例如,如果我使用1/1/70 00:00:00填充tm,如下所示:
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在给定日期/时间是否有效。
发布于 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()接受本地时间作为输入。
发布于 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。
https://stackoverflow.com/questions/47332528
复制相似问题