获取当前小时的unix时间戳

时间:2012-02-13 14:34:01

标签: c++ c timestamp

我想在c / c ++中得到当前(或任何给定的)小时开头的unix时间戳。

我有这个:


    time_t get_current_hour() {
        time_t beginning_of_hour;
        struct tm * ptm;

        time(&beginning_of_hour);

        ptm = gmtime(&beginning_of_hour);
        ptm->tm_min = 0;
        ptm->tm_sec = 0;
        ptm->tm_zone = (char*) "GMT";

        beginning_of_hour = mktime(ptm);

        return beginning_of_hour;
    }

哪个有效,但在高负荷下,许多结果不是当前小时的开始,而是实际时间。

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

请指教,    阿科什

3 个答案:

答案 0 :(得分:6)

您可以使用time_t完成所有操作,而不会将其拆分并重建 将其四舍五入为3600的倍数:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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