【问题标题】:Get current hour unix timestamp获取当前时间的 unix 时间戳
【发布时间】:2012-03-04 22:57:48
【问题描述】:

我想在 c/c++ 中获取当前(或任何给定的可能)小时开始的 unix 时间戳。

我有这个:

time_t get_current_hour() { time_t 开始_of_hour; 结构 tm * ptm; 时间(&beginning_of_hour); ptm = gmtime(&beginning_of_hour); ptm->tm_min = 0; ptm->tm_sec = 0; ptm->tm_zone = (char*) "GMT"; begin_of_hour = mktime(ptm); 返回开始时间; }

这可行,但在高负载下,许多结果不是当前时间的开始,而是实际时间。

有没有更好的方法来解决这个问题? 为什么函数返回当前时间?

请指教, 阿科斯

【问题讨论】:

    标签: c++ c timestamp


    【解决方案1】:

    您可以使用 time_t 完成所有操作,而无需拆分和重建。
    只需将其向下舍入为 3600 的倍数即可:

    time_t get_current_hour(void) {
        time_t now;
        time(&now);
        return now - (now % 3600);
    }
    

    也许将time_t 视为整数并不好。但我认为它保证是自纪元以来的秒数,所以应该没问题。

    【讨论】:

    • time_t 只保证是数字类型,所以它可能是double(不是我见过这样的东西)。
    • @JamesKanze:几千年后,当我们开始丢失 int 的最后几位时,这将在精确度上大打折扣。
    • @JamesKanze,只要now+1 == now 永远不正确,这段代码就可以工作。定义 time_t 允许这对我来说似乎很糟糕。
    • @LokiAstari 自 1970 年以来秒的 32 位 int 将在此之前很久就溢出。
    • @ugoren 我见过的一种情况是时间表示为double(不是time_t,而是在一个单独的库中),整数值是天。所以虽然now + 1 !@= now,但它可能不是您期望的结果。有趣的是,该标准定义了一个difftime,它返回一个double,但它没有提供任何东西来为time_t 添加秒(或天,或其他)。我猜你应该使用localtime,操纵tm 然后mktime 来做到这一点。
    【解决方案2】:

    可能是您有一个多线程应用程序,并且对gmtime 的调用不是线程安全的(可重入)。如果是这种情况,请尝试使用可重入版本:gmtime_r

    【讨论】:

    • 好吧,你说得有道理。该应用程序确实是多线程的。谢谢,我会用 gmtime_r。
    【解决方案3】:

    您的应用程序是多线程的吗? gmtime 返回一个 指向静态内存的指针,下次调用时将被覆盖 函数被调用。这样的函数不是线程安全的(这是 关于我能想到的唯一能解释你的事情 症状)。在 Unix 下,还有一个gmtime_r,它可以让你 声明一个本地缓冲区,并避免该问题; Windows 有一个_gmtime_s 这是(我认为)相似的。

    【讨论】:

    • 感谢您的回复,您是对的。该应用程序是多线程的,我将使用 gmtime_r
    猜你喜欢
    • 1970-01-01
    • 2022-07-08
    • 2021-12-04
    • 2013-03-10
    • 2018-01-05
    • 2011-12-26
    • 2013-07-20
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多