C++ C++;时间(NULL)给出不一致的结果
我有下面的函数来获取今天午夜的秒数C++ C++;时间(NULL)给出不一致的结果,c++,time,epoch,C++,Time,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
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;
cout是不是tm_isdst标志没有设置?差别正好是1小时。正如@jmihalicha answer中提到的,问题是您没有从本地
结构设置tm_isdst
标志。大概是因为您的时间相差一小时,所以两个结构中的标志是相反的,这两个时间中的一个,导致mktime
生成一个相差一小时的时间
但是,与使用mktime
不同的是,您可能会发现简单地将小时、分钟和秒数倒出来更容易(尽管这在DST转换期间不起作用-我无法从您的问题判断这是否是您的一个因素):
为了避免未初始化的内存位置(这似乎是您的情况)引起的问题,您应该使用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最好回答您的问题,这只是一个改进代码的建议。您可以使用local
本身来获得midnight\u epoch
,而不是从头开始创建一个tm
。这样你就避免了@jmihalicza在回答中指出的问题。你能在代码中说明这是如何工作的,或者在下面添加一个答案吗?这个标志重要吗?它不应该在随后的两次函数调用中给出相同的结果吗?因为DST不会在每个函数调用之间的微秒内发生变化。@user788171:如果不设置该标志,它将保持未初始化状态,因此可以有任何值(取决于堆栈内容)。试试看,我不能用你的原始代码重现你的问题,所以我也不能测试修复。
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);
}