如何确定夏令时是不是在 C 中处于活动状态?

Posted

技术标签:

【中文标题】如何确定夏令时是不是在 C 中处于活动状态?【英文标题】:How to determine if daylight saving time is active in C?如何确定夏令时是否在 C 中处于活动状态? 【发布时间】:2011-10-29 17:24:43 【问题描述】:

我有一个跨平台运行的 C 应用程序。在这个程序中,我需要编写一个函数来确定给定日期是否为 DST。 实际上,我尝试在纯 C 中查找 DST 开始-DST 结束日期。有什么简单而标准的方法可以做到这一点吗?

【问题讨论】:

请注意,每年有两天(作为一般规则)有 DST 和没有 DST,具体取决于具体时间。 您需要日期(和时间)和地点来确定它是否为DST。 DST 是一个政治问题:您根本不能依靠一些规则(或政治家)来确定未来日期的 DST。 Did you know Egypt changed their clocks four times last year? @pmg 在我的国家,夏令时开始于 3 月的最后一个星期日,夏令时结束于 10 月的最后一个星期日。所以我实际上需要计算每年三月和十月的最后一个星期日。 【参考方案1】:

time.htm 结构提供tm_isdst 标志。使用time 获取当前时间,使用localtime 获取一个tm 结构,将时间调整为当前语言环境并读取tm_isdst 标志。

来自手册页:

tm_isdst  A flag that indicates whether daylight saving time is in effect at the
time described.  The value is positive if daylight saving time is in effect, zero 
if it is not, and negative if the information is not available.

【讨论】:

@pmg 我认为这适合我的解决方案。我刚刚尝试进行计算,并且我看到 tm_isdst 标志设置正确。 localtime 或 mktime 都设置了 tm_isdst 标志,所以我可以在我的函数中使用这个标志。谢谢。 请注意,“本地时区和夏令时是实现定义的。” (the Standard 中的 7.23.1/1)如果您需要保证对可能不同的实现的可移植性,您不应该依赖它。 @pmg 很好的警告。虽然我真的不明白implementation-defined 在这种情况下是什么意思。实现仍然应该给出正确的结果,对吧? @pmr:我认为这意味着一个符合要求的实现可以,例如,假设tm_isdst 始终为 0,甚至从不费心检查它的各种 <time.h> 函数或假设时区是 GMT .希望结果是连贯的,但(轻微)不正确;也许这比政治家关于时间的想法给出的实际不连贯但正确的结果要好:) 任何实现,例如,我们有一个 time_t 的输入值,而不是来自时钟的 systemTime/LocalTIme(CurrentTime),而是来自用户输入,并从用户那里获取输入时间是否为 DST。提前致谢。【参考方案2】:

代码是:

time_t rawtime;
struct tm timeinfo;  // get date and time info
time(&rawtime);
localtime_s(&timeinfo, &rawtime);
int isdaylighttime = timeinfo.tm_isdst;

【讨论】:

任何实现,例如,我们有一个 time_t 的输入值,而不是来自时钟的 systemTime/LocalTIme(CurrentTime),而是来自用户输入,并从用户那里获取输入时间是否为 DST。提前致谢。【参考方案3】:

实现不允许假设 tm_isdst 始终为 0。 它必须提供正确的数据。 如果实现无法提供与某个国家/地区设置的规则一致的 tm_isdst,则应按照 7.23.1/4 in the same Standard 中的规定将 tm_isdst 设置为负值。

【讨论】:

以上是关于如何确定夏令时是不是在 C 中处于活动状态?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 找出当前是不是处于夏令时的时区 [重复]

如何确定给定日期是不是在 .NET 2.0 中给定时区的夏令时?

Laravel / Moment - 如何确定夏令时期间是不是 created_at?

如何判断是否英国夏令时

夏令时计算

使用python确定时间戳是不是在夏令时