我有一个 mktime 问题,如果由于 DST 更改而导致小时不存在,那么使用 MSVS 2010 的 windows 上的 mktime 将在过去返回一个 time_t,在我的情况下为 23:00,它应该在第二天凌晨 1:00 返回(在 Linux 上,它应该返回凌晨 1:00)。我的问题发生在巴西时区(格林威治标准时间 -3)上,恰好是自动调整夏令时发生的时间。在他们的情况下,这发生在 2012 年 10 月 21 日凌晨 0:00(这将变为凌晨 1:00)。
这是代码的一部分:
/* 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
如您所见,在 time_t 从 Unix 返回 C 和从 Microsoft Visual Studio 2010 返回 C 之间,mytime 差异是 3600 秒。
这个程序应该在不同的平台(UNIX/WINDOWS/etc)和任何时区上运行,所以我不应该对时区进行硬编码。
如您所见,问题出在 Windows 上,时间返回错误。在这一刻,我不知道如何解决这个问题。有人遇到过这个特殊问题吗?你是怎么解决的?我特别需要地方日的开始。
非常感谢,
笑话