首页 文章

获取当前小时的unix时间戳

提问于
浏览
4

我想在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;
    }

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

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

请告知,Akos

3 回答

  • 6

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

  • 1

    您可以使用 time_t 完成所有操作,而不会将其拆分并重建 .
    将它向下舍入到3600的倍数:

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

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

  • 0

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

相关问题