gpt4 book ai didi

c - 检测C中 future 日期的DST标志

转载 作者:行者123 更新时间:2023-12-04 08:30:25 24 4
gpt4 key购买 nike

我有一个系统,以字符串形式提供日期和时间,例如“2011-03-13 03:05:00”。我可能会在“2011-03-13 01:59:00”收到此字符串,并且我需要知道从现在到字符串中的时间之间的时间长度(由于 DST 更改而为 6 分钟)。

我有代码解析字符串并创建一个 tm 结构,然后使用 mktime 将其转换为 time_t。问题是我在解析时间时必须手动设置 tm_isdst 标志,因此我正在寻找一种方法来检测是否应该设置 tm_isdst 。有什么想法吗?

对于如何处理特定于我的应用程序的 2、2AM 的情况,我有一些想法,但我仍然需要一种方法来表达“如果这个时间是当前系统时间,DST 是否会在效果如何?”

编辑:基于皮特建议的想法。如果我:

  1. 检查收到的时间和当前系统时间是否有不同的时间:
  2. 如果是同一小时但过去的时间,请在当前时间上添加一个小时,然后查看 DST 标志是否发生变化。 (如果在同一时间和将来,则假定与当前时间相同的 DST 标志(这是一年中的大部分时间))
  3. 如果时间不同,我们会在当前系统时间上添加 1 小时,然后查看 DST 标志是否发生变化

想法?

最佳答案

根据man mktime(在Linux上,强调我的):

The value specified in the tm_isdst field informs mktime() whether or not daylight saving time (DST) is in effect for the time supplied in the tm structure: a positive value means DST is in effect; zero means that DST is not in effect; and a negative value means that mktime() should (use timezone information and system databases to) attempt to determine whether DST is in effect at the specified time.

你尝试过吗?

(这是“尝试确定”,因为有时根本上是不明确的。)

对于真正不明确的时间,您可以尝试的方法是查看 mktime 是否“更正”您的 dst 标志。我敢打赌这是不可移植的。示例代码,转换设置为 31/10/2010,凌晨 3 点在我的时区(欧洲/巴黎)回滚到凌晨 2 点:

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

void printit(int hour, int isdst)
{
struct tm when;
memset(&when, 0, sizeof(when));
when.tm_sec = 0;
when.tm_min = 30;
when.tm_hour = hour;
when.tm_mday = 31;
when.tm_mon = 9;
when.tm_year = 110;
when.tm_isdst = isdst;
time_t secs = mktime(&when);
fprintf(stdout, "%2d %ld %d %s", isdst, secs, when.tm_isdst, asctime(&when));
}

int main(int argc, char **argv)
{
for (int i=1; i<4; i++) {
fprintf(stdout, "At %dam\n", i);
printit(i, 1);
printit(i, 0);
printit(i, -1);
}
}

输出是:

At 1am
1 1288481400 1 Sun Oct 31 01:30:00 2010
0 1288485000 1 Sun Oct 31 02:30:00 2010
-1 1288481400 1 Sun Oct 31 01:30:00 2010
At 2am
1 1288485000 1 Sun Oct 31 02:30:00 2010
0 1288488600 0 Sun Oct 31 02:30:00 2010
-1 1288488600 0 Sun Oct 31 02:30:00 2010
At 3am
1 1288488600 0 Sun Oct 31 02:30:00 2010
0 1288492200 0 Sun Oct 31 03:30:00 2010
-1 1288492200 0 Sun Oct 31 03:30:00 2010

如您所见,当时间明确时,mktime 通过设置正确的 tm_isdst 并偏移时间来纠正它。当它不明确时,tm_isdst不会改变。

关于c - 检测C中 future 日期的DST标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5288275/

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