我有以下功能来获取当天午夜以来的秒数。
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;
我一直得到截然不同的结果,例如: 1367816400 1367812800
这是差不多4000秒。我希望数字是一样的。谁能看到我做错了什么?
答案 0 :(得分:5)
是不是tm_isdst标志未设置?差异恰好是1小时。
答案 1 :(得分:1)
@jmihalicza回答中提到的问题是,您没有从tm_isdst
结构中设置local
标志。大概是因为你的时间相差一小时,两个结构中的一个标志在两个结构中相反,导致mktime
生成一个小时不同的时间。
不过使用mktime
,您可能会发现简单地退出小时,分钟和秒钟更容易(虽然这在DST过渡期间无法正常工作 - 我无法从您的问题中判断出来这是你的一个因素):
return t - (timeinfo.tm_hour * 3600) - (timeinfo.tm_min * 60) - timeinfo.tm_sec;
答案 2 :(得分:1)
为了避免由未初始化的内存位置(这似乎是您的情况)引起的问题,您应该使用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更好地回答了您的问题,这只是改善您的代码的建议。