【发布时间】:2011-04-09 07:50:21
【问题描述】:
我在使用 C++ (VS 2008) 进行日期管理时遇到问题。
根据MSDN specifications,time_t代表:
自 1970 年 1 月 1 日 0:00 UTC 以来的秒数
因此,我写了这段代码:
#include <stdio.h>
#include <time.h>
time_t GetDate(int year, int month, int day, int hour, int min, int sec)
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = gmtime ( &rawtime );
timeinfo->tm_year = year - 1900;
timeinfo->tm_mon = month - 1;
timeinfo->tm_mday = day;
timeinfo->tm_hour = hour;
timeinfo->tm_min = min;
timeinfo->tm_sec = sec;
timeinfo->tm_isdst = 0; // disable daylight saving time
time_t ret = mktime ( timeinfo );
return ret;
}
int main ()
{
time_t time_0 = GetDate(1970,1,1,0,0,0);
// time_0 == -1 !!!
time_t time_1 = GetDate(1970,1,1,1,0,0);
// time_1 == 0 !!!
return 0;
}
它似乎移动了 1 小时(即零时间是 1970 年 1 月 1 日 1:00 UTC)。
最初,我认为问题可能来自 DayLightSaving 标志,但更改它并不会改变它。
我做错了吗?
提前致谢
附: 理论上,我可能不介意零时间值,因为它只是一个参考时间。
但我需要确定值,因为我正在将代码移植到另一种语言,并且我需要得到完全相同的结果。
编辑:
这是解决方案,感谢Josh Kelley Answer
time_t mktimeUTC(struct tm* timeinfo)
{
// *** enter in UTC mode
char* oldTZ = getenv("TZ");
putenv("TZ=UTC");
_tzset();
// ***
time_t ret = mktime ( timeinfo );
// *** Restore previous TZ
if(oldTZ == NULL)
{
putenv("TZ=");
}
else
{
char buff[255];
sprintf(buff,"TZ=%s",oldTZ);
putenv(buff);
}
_tzset();
// ***
return ret;
}
【问题讨论】:
-
-1 是错误条件,而不是 1970 年 1 月 1 日之前的 1 秒。
-
他应该检查 -1 返回的 errno 并查看它的设置。
标签: c++ c visual-studio-2008 time