工作中遇到一个有趣的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);
}
本文描述了一种在计算本地时间0点时间戳时出现的Bug,该Bug在8点前计算出的时间戳不正确。通过将tm结构体的时分秒清零并转换为时间戳,实现了正确的算法。





