我想在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; }
哪个有效,但在高负荷下,许多结果不是当前小时的开始,而是实际时间。
有没有更好的方法来解决问题? 为什么函数返回当前时间?
请指教, 阿科什
答案 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
这是(我认为)类似的。