C ++ time_t问题

我在C ++中使用日期管理遇到了麻烦(VS 2008)。

根据MSDN规范 , time_t代表:

自1970年1月1日0:00 UTC以来的秒数

因此,我写了这段代码:

 #include  #include  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标志,但它不会通过更改它而改变。

难道我做错了什么 ?

提前致谢


PS理论上,我可能不介意零时间值,因为它只是一个参考时间。

但我需要确定价值,因为我将代码移植到另一种语言,我需要获得完全相同的结果。


编辑:

这是解决方案,感谢Josh Kelley答案

 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; } 

mktime采用struct tm给出本地时间并返回自1970年1月1日0:00 UTC以来的秒数。 因此,你的GetDate(1970,1,1,0,0,0); 如果您的本地时区是UTC,则呼叫将返回0,但可能会返回其他时区的其他值。

编辑:对于mktime或您的GetDate的UTC版本,请尝试以下(未经测试):

  1. 调用getenv以保存TZ环境变量的当前值(如果有)。
  2. 调用putenv将TZ环境变量更改为“UTC”。
  3. 调用_tzset使您的更改_tzset
  4. 打电话给mktime
  5. 恢复TZ的旧值,然后再次调用_tzset

只是一个WAG但请尝试以下方法:

 timeinfo->tm_year = year - (unsigned long)1900; timeinfo->tm_mon = month - (unsigned long)1;