c++ time(NULL)给出不一致的结果
C++ time(NULL) gives inconsistent results
我使用下面的函数来获取从epoch到今天午夜的秒数。
long int midnight_time()
{
time_t t;
struct tm *local;
t = time(NULL);
struct tm timeinfo;
local = localtime(&t);
timeinfo.tm_year = local->tm_year;
timeinfo.tm_mon = local->tm_mon;
timeinfo.tm_mday = local->tm_mday;
timeinfo.tm_hour = 0;
timeinfo.tm_min=0;
timeinfo.tm_sec=0;
long int midnight_epoch = mktime(&timeinfo);
return midnight_epoch;
}
当我在代码中连续两次调用这个函数时,例如
cout<<midnight_time()<<endl;
cout<<midnight_time()<<endl;
我总是得到完全不同的结果,例如:13678164001367812800
相差近4000秒。我希望数字是一样的。有人能看出我做错了什么吗?
是不是没有设置tm_isdst标志?
为了避免由未初始化的内存位置引起的问题(这似乎是您的情况),您应该使用由localtime
函数返回指针的tm结构。下面是一个例子:
time_t midnight_time()
{
struct tm *local;
time_t now = time(NULL);
local = localtime(&now);
local->tm_hour = 0;
local->tm_min=0;
local->tm_sec=0;
return mktime(local);
}
@jmihalicza更好地回答了你的问题,这只是一个改进你的代码的建议。
这个问题,正如@jmihalicza回答所暗示的那样,是你没有从local
结构体设置tm_isdst
标志。假定由于您的时间相差一个小时,因此在您的两个结构中有一个标志是相反的,这导致mktime
生成的时间相差一个小时。
而不是使用mktime
,您可能会发现简单地返回小时,分钟和秒更容易(尽管这在DST转换期间不会很好地工作-我无法从您的问题中看出这是否是您的因素):
return t - (timeinfo.tm_hour * 3600) - (timeinfo.tm_min * 60) - timeinfo.tm_sec;
相关文章:
- 如何查找导致结果不一致的代码
- 结果与 fstream::read 不一致
- 使用迭代器对向量的C 递归初始化产生不一致的结果
- boost::d ynamic_bitset 与 std::vector 的结果不一致<bool>?
- 使用不同的表达式计算同一整数时的结果不一致
- RapidJSON 在转换为字符串时产生不一致的结果
- 使用两种不同的方法遍历 Vector 的结果不一致
- GDI打印API StartDoc函数给出的结果不一致
- 位掩码结果不一致
- is_assignable<>结果不一致
- opencvmatchTemplate在计算机之间给出不一致的结果
- CPPCheck返回不一致的结果
- 异步函数产生不一致的结果
- 使用 strptime/strftime 的结果不一致
- 双精度数组和结果与 WIN32 和 WIN64 上的C++不一致
- 在opencv中findChessboardCorners()的结果不一致
- CUDA 共享内存 - 结果不一致
- C++/CImg结果不一致
- 从文件中读取的浮点值与计算结果不一致
- std::regex_search与gcc 4.9.1的结果不一致