我想在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 回答
可能是您有一个多线程应用程序,并且对
gmtime
的调用不是线程安全的(可重入) . 如果是这种情况,请尝试使用可重入版本:gmtime_r
您可以使用
time_t
完成所有操作,而不会将其拆分并重建 .将它向下舍入到3600的倍数:
也许将
time_t
视为整数并不好 . 但是我认为它可以保证是自纪元以来的几秒钟,所以应该没问题 .您的应用程序是否是多线程的?
gmtime
返回一个指向静态内存的指针,该指针将在下次调用该函数时被覆盖 . 这些函数不是线程安全的(这是我能想到的唯一可以解释你的症状的东西) . 在Unix下,还有一个gmtime_r
,它允许你声明一个本地缓冲区,并避免这个问题; Windows有_gmtime_s
(我认为)类似 .