工作中遇到一個有趣的bug,在獲取今天0點的時間戳時,我是這樣算的:
uint64_t today_timestamp()
{
uint64_t now_time = time(NULL);
// 當前時間戳 -(當前時間戳 % 24h)
return now_time - (now_time % (60 * 60 * 24)) - 60 * 60 * 8;
}
這個函數計算到的凌晨0點的時間戳,在早晨8點以後得到的結果是正確的,正好是工作的時間段,所以在工作的時候測的時候一直沒有重現bug。這個函數忽略了一個問題,0時區的日期不一定等於+8時間的日期,只有在8點以後是相等的。
正確的算法是這樣的:
// 直接把tm結構體的時分秒清零,然後轉化成時間戳
uint64_t today_timestamp()
{
time_t t = time(NULL);
struct tm * tm= localtime(&t);
tm->tm_hour = 0;
tm->tm_min = 0;
tm->tm_sec = 0;
return mktime(tm);
}