c++ clock_gettime() 和夏令时
Posted
技术标签:
【中文标题】c++ clock_gettime() 和夏令时【英文标题】:c++ clock_gettime() and daylight savings 【发布时间】:2012-06-23 01:27:32 【问题描述】:我在我的 C++ 程序中使用 clock_gettime() 来获取当前时间。但是,返回值是UTC 纪元以来的秒数。在夏令时期间,当时间偏移一小时时,此代码可能会在我的时区混乱。
系统本身有 NTP 同步它以始终在 EST 中提供正确的时间。有没有办法让clock_gettime() 报告当地时间而不是UTC,这样我就可以避免夏令时问题?
【问题讨论】:
你为什么不直接从 UTC 转换为本地时间?将“获取时间”与“转换为本地时间”分开。 当然可以,但是我必须每年在我的代码中手动更改转换系数两次。 我不是建议硬编码它。我建议使用可识别时区的日期/时间库来执行转换。 还可以考虑使用cctz 库进行转换。 【参考方案1】:意识到time
还报告自 1970 年初以来的秒数(在 time_t
中)。如果你把timespec
的tv_sec
成员传递给localtime
或localtime_r
,你应该得到你想要的。
timespec tsv;
clock_gettime(CLOCK_REALTIME, &tsv);
time_t t = tsv.tv_sec; // just in case types aren't the same
tm tmv;
localtime_r(&t, &tmv); // populate tmv with local time info
您可以随心所欲地处理timespec
的tv_nsec
成员。
【讨论】:
这段代码似乎无法为我编译,我遇到了这个问题:错误:无法转换 ?timespec*?到 ?const time_t*?论据?1?到 ?tm* localtime_r(const time_t*, tm*)? @user788171:代码为我逐字编译。我从编译后的代码中粘贴了它。【参考方案2】:如果您使用的是 Windows,则可以使用此 GetTimeZoneInformation,但您必须包含 Windows API。
实现此目的的另一种方法是 struct tm。您将在此处找到详细信息:struct tm。 “如果夏令时有效,夏令时标志 (tm_isdst) 大于零,如果夏令时无效,则为零,如果信息不可用,则小于零。”我认为这是更简单的方法。
【讨论】:
【参考方案3】:如果您能够使用 Boost,则可以使用日期时间库显式控制所有这些:http://www.boost.org/doc/libs/1_49_0/doc/html/date_time.html
我不得不在各种平台和各种语言上处理时间,我发现 boost 库比其他任何可用的库都优越得多。
【讨论】:
对不起,这对我来说不是很有用。【参考方案4】:#include <time.h>
time_t rawtime;
struct tm *timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
if (timeinfo->tm_isdst)
Hour -= 1; // daylight savings time
【讨论】:
这段代码是我在Windows Visual Studio C++中使用的 以上代码来自cplusplus.com/reference/ctime/tm 但是如果你只使用timeinfo中的日期和时间,月份是错误的。以上是关于c++ clock_gettime() 和夏令时的主要内容,如果未能解决你的问题,请参考以下文章
为什么在重复调用clock_gettime时会看到400x异常值时序?