我有一个mktime问题,如果小时因为DST更改而不存在,那么使用MSVS 2010的窗口上的mktime将返回一个time_t在我的情况下为23:00,当它应该在第二天上午1:00返回时(在Linux上它将返回上午1:00,因为它应该)。我的问题正好发生在巴西时区(格林威治标准时间-3),恰好在自动调整夏令时的时候。在他们的情况下,这发生在2012年12月21日凌晨0点(这将变成凌晨1点)。转换不存在的struct tm时mktime问题(由于日光转换时间)
这是代码的一部分:
/* test_date1.cpp : Defines the entry point for the console application.
*
*/
#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int _tmain(int argc, _TCHAR* argv[])
{
time_t mytime=1350784881;
struct tm *timeinfo;
char *tz;
/*time (&mytime); */
timeinfo = localtime (&mytime);
printf("%.2d/%.2d/%.4d, %.2d:%.2d isdst?=%d\n",
timeinfo->tm_mday, timeinfo->tm_mon, timeinfo->tm_year, timeinfo->tm_hour, timeinfo-> tm_min, timeinfo -> tm_isdst);
timeinfo->tm_mday=21;
timeinfo->tm_mon=9;
timeinfo->tm_year=112;
timeinfo->tm_hour=0;
timeinfo->tm_min=0;
timeinfo->tm_isdst=-1;
printf("The shit: %.2d/%.2d/%.4d, %.2d:%.2d isdst?=%d\n",
timeinfo->tm_mday, timeinfo->tm_mon, timeinfo->tm_year, timeinfo->tm_hour, timeinfo-> tm_min, timeinfo -> tm_isdst);
mytime= mktime(timeinfo);
printf("mytime is=%d\n", mytime);
timeinfo = localtime (&mytime);
printf("%.2d/%.2d/%.4d, %.2d:%.2d isdst?=%d\n",
timeinfo->tm_mday, timeinfo->tm_mon, timeinfo->tm_year, timeinfo->tm_hour, timeinfo-> tm_min, timeinfo -> tm_isdst);
return 0;
}
在Windows上的结果是:
20/09/0112, 23:01 isdst?=0
21/09/0112, 00:00 isdst?=-1
mytime is=1350784800
20/09/0112, 23:00 isdst?=0
在Linux是:
20/09/0112, 23:01 isdst?=0
21/09/0112, 00:00 isdst?=-1
mytime is=1350788400
21/09/0112, 01:00 isdst?=1
正如你所看到的数值指明MyTime差异在time_t从Unix返回C和从Microsoft Visual Studio 2010返回C之间是3600秒。
这个程序应该运行在不同的平台上(UNIX/WINDOWS/etc)和任何时区,所以我不应该对时区进行硬编码。
正如你看到的问题是在Windows上错误地返回时间。在这一刻,我不知道如何解决这个问题。有人有这个特殊问题吗?你是如何解决它的?我特别需要当地的日子。
非常感谢,
Jokerush
当你问这样的问题时,总是记录操作系统版本。看看TZ环境变量带给你什么。 –