DST の変更のために時間が存在しない場合、mktime の問題があります。MSVS 2010 を使用している Windows の mktime は、過去の time_t を返します。 Linux では、本来なら午前 1:00 を返します)。私の問題は、ブラジルのタイムゾーン (GMT -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 diff は 3600 秒です。
このプログラムは、さまざまなプラットフォーム (UNIX/WINDOWS/etc) および任意のタイムゾーンで実行する必要があるため、タイムゾーンをハードコーディングしないでください。
あなたが見たように、問題は時間が間違って返される Windows にあります。現時点では、この問題を修正する方法がわかりません。誰かがこの特定の問題を抱えていましたか?どのように解決しましたか?ローカルデーの開始が特に必要です。
どうもありがとう、
ジョーカーラッシュ