如何在C语言中确定夏令时是否激活?

6

我有一个跨平台的C应用程序。在这个程序中,我需要编写一个函数来确定给定的日期是否处于夏令时(DST)。
实际上,我尝试找到纯C中DST开始-DST结束日期。是否有任何简单和标准的方法来做到这一点?


请注意,一般情况下每年有两天既有夏令时又没有夏令时,这取决于具体时间。 - Vatine
您需要同时拥有日期(和时间)和地点才能确定它是否夏令时。而夏令时是一项政治问题:您无法仅依靠少数规则(或政治家)来确定未来日期的夏令时。您知道埃及去年更改了四次时区吗 - pmg
@pmg 在我的国家,夏令时从三月的最后一个星期日开始,到十月的最后一个星期日结束。因此,我实际上需要为每年计算三月和十月的最后一个星期日。 - Fer
3个回答

9

time.h提供了带有tm_isdst标志的tm结构。使用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.

1
@pmg 我认为这适合我的解决方案。我刚刚尝试了一下计算,发现tm_isdst标志被正确设置了。localtime或mktime都会设置tm_isdst标志,因此我可以在我的函数中使用这个标志。谢谢。 - Fer
请注意,“本地时区和夏令时的定义是由实现定义的。”(标准中的7.23.1/1)。如果您需要确保可移植性到许多不同的实现,您不应该依赖于它。 - pmg
@pmg 不错的警告。虽然我真的不明白在这种情况下implementation-defined是什么意思。但实现应该仍然给出正确的结果,对吧? - pmr
1
@pmr:我认为这意味着符合规范的实现可以假定 tm_isdst 始终为 0,甚至不必为各种 <time.h> 函数检查它,或者假定时区为 GMT。希望结果是连贯的,但是(稍微)不正确的;也许这比政治家对时间的想法给出的实际不连贯但正确的结果更好 :) - pmg
任何实现方式都可以,我们有一个time_t类型的输入值,而不是从系统时钟中获取当前时间(systemTime/LocalTime),而是从用户输入中获取该输入时间,并确定该输入时间是否为夏令时。提前致谢。 - Ayush joshi

1

代码是:

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),而是从用户输入中获取该输入时间,并确定该输入时间是否为夏令时。提前致谢。 - Ayush joshi

0

实现不允许假定tm_isdst始终为0。它必须提供正确的数据。如果实现无法提供与国家规则一致的tm_isdst,则应将tm_isdst设置为负值,如7.23.1/4 在同一标准中所指定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接