У меня проблема с mktime, если час не существует из-за перехода на летнее время, тогда mktime в Windows, использующих MSVS 2010, вернет time_t в прошлом, в моем случае на 23:00, когда он должен вернуть 1:00 утра следующего дня ( в Linux он возвращает 1:00, как и должно быть). Моя проблема возникает в часовом поясе Бразилии (GMT -3), когда должна произойти автоматическая настройка летнего времени. В их случае это произойдет 21 октября 2012 года в 0:00 (будет 01: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
А в линуксе есть:
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 diff составляет 3600 секунд между тем, что time_t возвращает C из Unix, и тем, что возвращает C из Microsoft Visual Studio 2010.
Эта программа должна работать на разных платформах (UNIX/WINDOWS/и т. д.) и в любом часовом поясе, поэтому я не должен жестко указывать часовой пояс.
Как вы видели, проблема в Windows, где время возвращается неправильно. В данный момент я не знаю, как решить эту проблему. У кого-то была эта конкретная проблема? Как вы это решили? Мне особенно нужно начало Местного Дня.
Большое спасибо,
Джокеруш