如何在PST切换到PDT时找到下一个日期,反之亦然

时间:2011-08-10 21:28:59

标签: c++ winapi datetime timezone

我的程序在时区为not PST / PDT的Windows计算机上运行。但它需要根据PST / PDT时间规则运行。

到夏季/冬季时,该计划需要知道 PDT更改为PST的下一个日期,反之亦然 如何用C ++编程找到下一个夏季< - >冬季开关?

3 个答案:

答案 0 :(得分:1)

由于美国国会的各种行为导致夏令时的开始和结束都发生了变化,因此下一次储蓄过渡的信息并不固定。我不知道您是否需要重新启动以应用DST更改,但如果这样做,您可能希望更频繁地更新下一次转换的估计值。

获取此信息的原生API为GetTimeZoneInformationForYear。您可以传入特定的时区和年份。该函数填充TIME_ZONE_INFORMATION结构;您想要的相关信息是TIME_ZONE_INFORMATION::DaylightDateTIME_ZONE_INFORMATION::StandardDate

答案 1 :(得分:0)

如果您使用的是Windows,请使用C#类执行此操作,并通过您选择的互操作将结果返回到C ++程序。另外,您可能最终会重建在C +中执行此操作的.Net代码,并且在此过程中会错过.Net将为您处理的所有边缘情况。

您可以使用TimeZoneInfo.Local,然后使用get the adjustment rules

答案 2 :(得分:0)

丑蛮的暴力方法:

致电time(NULL),将当前时间作为time_t值。

使用localtime()将此值转换为struct tm。 (考虑将tm_hour成员调整为12,因此您每天都在中午检查。)

反复向tm_day struct tm成员添加1天,然后使用mktime()转换回time_t

使用difftime()将每个递增的time_t值与前一个值进行比较。当`difftime()给你一个不接近86400.0(1天内的秒数)的值时,你就找到了DST转换。如果你这样做365次而没有找到过渡,那就错了。

如果您愿意对time_t的表示做出一些假设,您可以采取一些捷径。

显然,这只是一个解决方案的大纲 - 我自己没有尝试过。

我刚刚重新阅读了这个问题,并意识到我完全忽略了你所说的计算机不在PST或PDT上的部分。 (你能为这个节目设定时区吗?)