【发布时间】:2012-03-13 06:23:04
【问题描述】:
假设给了我这样一个字符串:"2009-4-9",表示 2009 年 4 月 9 日。假设首先,我只关心本地时间(我也关心其他时区,但我'将首先解决简单的事情)。了解夏令时是否在当时有效的最佳方式是什么?
您可以假设系统具有正确更新的时区文件,例如/etc/localtime,并且我对便携式解决方案感兴趣。 c 或 c++ 都可以接受。
你也可以假设我只关心过去或现在的日期,而不关心未来。
目前我有一个看起来像这样的“hack”(我知道 localtime_r 是一个库扩展,但它与我可以使其便携的相同功能足够接近)
struct tm tm;
// convert the time string to a broken down structure in localtime
if(strptime("2009-4-9", "%Y-%m-%d", &tm)) {
// convert the broken down structure into seconds since epoch
const time_t t = mktime(&tm);
// convert it back to a broken down structure, this seems pointless at first...
// but libc will fill out fields such as tm_isdst
localtime_r(&t, &tm);
printf("DST : %d\n", tm.tm_isdst);
}
虽然这行得通(而且似乎是一种非常有效的方法),但我觉得来回转换很愚蠢。有没有更好的办法?
【问题讨论】:
-
您关心一天中的什么时间?它可能是一天开始时的一个偏移量和一天结束时的另一个偏移量......
-
@JonSkeet:好问题,您可以假设一天中的任何时间。我敢肯定这会使问题进一步复杂化......实际上,标准工作时间左右的时间是常见的用例。