1

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 にあります。現時点では、この問題を修正する方法がわかりません。誰かがこの特定の問題を抱えていましたか?どのように解決しましたか?ローカルデーの開始が特に必要です。

どうもありがとう、

ジョーカーラッシュ

4

1 に答える 1

0

無効な時間を渡したときにmktimeの動作が定義されているかどうかはわかりません。したがって、これは実際にはバグではない可能性があります。

いずれにせよ、mktimeを自分で再実装する以外に、問題を回避する必要があります。私は次のアルゴリズムを提案します:

  • 問題の日の午前9時に構造体tmを作成します。
  • time_tに変換します。
  • time_tから24時間を引きます。

夏時間の変更がない場合、この時点で前日の午前9時を見ています。夏時間が開始された場合は、午前8時を見ています。終了した場合は、午前10時を見ています。

  • 構造体tmに変換し直します。
  • structtmの日付を元の日付と比較します。
  • まだ適切な日でない場合は、time_tに1時間を追加して、再試行してください。

一度に追加するのは1時間だけなので、希望の日付を取得すると、その日付の最も早い時刻を確実に取得できます。

私は現在安全だと思ういくつかの仮定を立てています。夏時間は1時間の途中で開始または終了することはなく、午前8時から午前10時の間に開始または終了することはなく、1時間以上変化することはありません。

私は意図的に、夏時間が夕方(たとえば、午後11時が深夜になるかその逆)または早朝(たとえば、午前2時が午前3時になる、またはその逆)に開始または終了しないとは想定していません。ここで起こります)。

于 2012-09-03T21:14:48.267 に答える