【问题标题】:c++ clock_gettime() and daylight savingsc++ clock_gettime() 和夏令时
【发布时间】:2012-06-23 01:27:32
【问题描述】:

我在我的 C++ 程序中使用 clock_gettime() 来获取当前时间。但是,返回值是UTC 纪元以来的秒数。在夏令时期间,当时间偏移一小时时,此代码可能会在我的时区混乱。

系统本身有 NTP 同步它以始终在 EST 中提供正确的时间。有没有办法让clock_gettime() 报告当地时间而不是UTC,这样我就可以避免夏令时问题?

【问题讨论】:

  • 你为什么不直接从 UTC 转换为本地时间?将“获取时间”与“转换为本地时间”分开。
  • 当然可以,但是我必须每年在我的代码中手动更改转换系数两次。
  • 我不是建议硬编码它。我建议使用可识别时区的日期/时间库来执行转换。
  • 还可以考虑使用cctz 库进行转换。

标签: c++ time clock dst


【解决方案1】:

意识到time 还报告自 1970 年初以来的秒数(在 time_t 中)。如果你把timespectv_sec 成员传递给localtimelocaltime_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

您可以随心所欲地处理timespectv_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++中使用的
    • 但是如果你只使用timeinfo中的日期和时间,月份是错误的。
    猜你喜欢
    • 2014-04-28
    • 2013-03-18
    • 2012-10-23
    • 2016-02-02
    • 2010-09-19
    • 2017-04-29
    • 2016-10-11
    • 2021-06-22
    • 2014-02-22
    相关资源
    最近更新 更多