这是功能
time_t time_from_string(const char* timestr)
{
if (!timestr)
return 0;
struct tm t1;
memset(&t1, 0, sizeof(t1));
int nfields = sscanf(timestr, "%04d:%02d:%02d %02d:%02d:%02d",
&t1.tm_year, &t1.tm_mon, &t1.tm_mday, &t1.tm_hour,
&t1.tm_min, &t1.tm_sec);
if (nfields != 6)
return 0;
t1.tm_year -= 1900;
t1.tm_mon--;
t1.tm_isdst = -1; // mktime should try itself to figure out what DST was
time_t result = mktime(&t1);
return result;
}
当我使用参数“2007:11:14 11:19:07”调用它时,它在 Linux(Ubuntu 12.04、gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3)中返回 1195028347,在 Windows 中返回 1195024747(windows 7、Visual Studio 2010)。
可以看出,时差是3600。
我在同一台计算机上运行两个操作系统(双启动),它位于 MSK 时区。两个操作系统都与互联网时间同步,并且它们的系统时钟显示正确的时间。
当我使用另一个参数“2012:08:21 18:20:40”调用此函数时,我在两个系统中都得到 1345558840。
为什么在几种情况下结果不同?
编辑
忘了提。我在调用后控制 t1 变量的内容mktime()
。
在这两个系统中:
t1.tm_sec = 7;
t1.tm_min = 19;
t1.tm_hour = 11;
t1.tm_mday = 14;
t1.tm_mon = 10;
t1.tm_year = 107;
t1.tm_wday = 3;
t1.tm_yday = 317;
t1.tm_isdst = 0;
请提到最后一行。两个系统都确定没有有效的夏令时。
Linux 在 中还显示了以下字段struct tm
:
t1.gmtoff = 10800;
t1.tm_zone = "MSK";