gpt4 book ai didi

c - mktime 和 tm_isdst

转载 作者:太空狗 更新时间:2023-10-29 16:36:05 41 4
gpt4 key购买 nike

我看到了很多不同的观点,所以想在这里问问。

我阅读了man mktime:

 (A positive or zero value for tm_isdst causes mktime() to presume initially
that summer time (for example, Daylight Saving Time) is or is not in
effect for the specified time, respectively. A negative value for
tm_isdst causes the mktime() function to attempt to divine whether summer
time is in effect for the specified time.

我的问题是,不应该将 tm_isdst 保留为 -1 让系统决定它是否是 dst,这样代码就变得与 dst 无关?

我错过了什么吗?

最佳答案

如果可能,您应该避免将 tm_isdst 设置为 -1。系统不能始终仅从日期和时间确定 DST 状态。夏令时结束前后的小时是不明确的。例如,如果您传递 mktime() 1:30 AM November 4, 2012,则该信息不足以从 mktime()< 获取正确的 time_t。通常我已经看到 mktime() 在模棱两可的情况下假定标准时间,但我没有看到任何文档可以保证所有平台上的行为。 2012 年 11 月 4 日凌晨 1:30 使用 tm_isdst == 1 将早于 1 小时,因为 1:00:00 到 1:59:59 重复。

#include <stdio.h>
#include <time.h>

int main()
{
time_t daylight, standard;
struct tm timestr;
double diff;

timestr.tm_year = 2012 - 1900;
timestr.tm_mon = 11 - 1;
timestr.tm_mday = 4;
timestr.tm_hour = 1;
timestr.tm_min = 30;
timestr.tm_sec = 0;

/* first with standard time */
timestr.tm_isdst = 0;
standard = mktime(&timestr);

/* now with daylight time */
timestr.tm_isdst = 1;
daylight = mktime(&timestr);

diff = difftime(standard, daylight);

printf("Difference is %f hour(s)", diff/60.0/60.0);

return 0;
}

这会产生:

Difference is 1.000000 hour(s)

两者都是 2012 年 11 月 4 日凌晨 1:30,但两者都是两个不同的 time_t 值,相隔 1 小时。

mktime() 基本上有 2 个输出:

  • time_t
  • 修复时间结构

时间结构既是输入又是输出。它由 mktime() 修改以将所有结构成员返回到标称范围。例如,如果您增加 tm_hour 成员 += 500,这意味着将时间增加 500 小时。 tm_hour 成员将更改为值 00 到 23,tm_daytm_mday 等都将相应调整。 tm_isdst 也是输入和输出。它的值如下:

  • 1(夏令时有效,即夏令时)
  • 0(DST 无效,即标准时间)
  • -1(夏令时状态未知)

因此 mktime() 将为 tm_isdst 输出 1 或 0,绝不会输出 -1。

-1 是一个可能的输入,但我认为它的意思是“未知”。不要认为它是“自动确定”的意思,因为一般情况下,mktime() 不能总是自动确定。

明确的 DST 状态(0 或 1)应该来自软件外部的某些东西,例如将其存储在文件或数据库中,或者提示用户。

关于c - mktime 和 tm_isdst,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8558919/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com