我在我的 C++ 程序中使用 clock_gettime() 来获取当前时间。但是,返回值是UTC 纪元以来的秒数。在夏令时期间,当时间偏移一小时时,此代码可能会在我的时区混乱。
系统本身有 NTP 同步它以始终在 EST 中提供正确的时间。有没有办法让clock_gettime() 报告当地时间而不是UTC,这样我就可以避免夏令时问题?
意识到这time
也报告了自 1970 年初以来的秒数(在 a 中time_t
)。如果你把 的tv_sec
成员timespec
传递给localtime
or 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
您可以随心所欲地处理tv_nsec
成员。timespec
如果您使用的是 Windows,则可以使用此GetTimeZoneInformation,但您必须包含 Windows API。
实现此目的的另一种方法是 struct tm。您将在此处找到详细信息:struct tm。“如果夏令时有效,夏令时标志 (tm_isdst) 大于零,如果夏令时无效,则为零,如果信息不可用,则小于零。” 我认为这是更简单的方法。
如果您能够使用 Boost,则可以使用日期时间库显式控制所有这些:http: //www.boost.org/doc/libs/1_49_0/doc/html/date_time.html
我不得不在各种平台和各种语言上处理时间,我发现 boost 库比其他任何可用的库都优越得多。
#include <time.h>
time_t rawtime;
struct tm *timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
if (timeinfo->tm_isdst)
Hour -= 1; // daylight savings time