質問

続行 DateTimeクラスを作成しようとする私の試み 、私は自分の機能に「エポック」時間を保存しようとしています:

void DateTime::processComponents(int month, int day, int year, 
                                 int hour, int minute, int second) {
    struct tm time;
    time.tm_hour = hour;
    time.tm_min = minute;
    time.tm_sec = second;
    time.tm_mday = day;
    time.tm_mon = month;
    time.tm_year = year - 1900;
    ticks_ = mktime(&time);

    processTm(time);
}

void DateTime::processTm(struct tm time) {
    second_ = time.tm_sec;
    minute_ = time.tm_min;
    hour_ = time.tm_hour;
    weekday_ = time.tm_wday;
    monthday_ = time.tm_mday;
    yearday_ = time.tm_yday;
    month_ = time.tm_mon;
    year_ = time.tm_year + 1900;
}

任意の日付のために、 processComponents(5,5,1990,1,23,45) (1990年6月6日1:23:45 AM)、それはすべての値を正しく、予想どおりに設定します。

しかし、さらにテストすると、 processComponents(0,0,1970,0,0,0) (1970年1月1日、午前12:00:00)、 mktime(&time) 原因 time ねじ込まれる:

time.tm_mon  = 11;
time.tm_mday = 30;
time.tm_year = 69;
time.tm_hour = 23;
time.tm_min  = 0;
time.tm_sec  = 0;

time.tm_isdst  = 0;
time.tm_gmtoff = -18000;
time.tm_zone   = "EST";
time.tm_wday   = 2;
time.tm_yday   = 363;

1969年12月31日の日付に翻訳午後11:00:00 pm。

私はそれを確認することができます mktime() そのラインをコメントすることで、1970年1月1日12:00:00 AMとして日付と時刻を正しく報告するためです。

なぜそうなのか mktime() エポックを台無しにするだけですか?そして、これをどのように修正 /回避する必要がありますか?

ありがとう!

役に立ちましたか?

解決

あなたは0を渡します day パラメーターとそれを入力します time.tm_mday. 。そのコンポーネント(およびそのコンポーネントのみ) struct tm 0ベースではなく、1ベースです。

理由を聞かないでください。

1970年1月1日、午前12:00:00を指定するには、そう呼びたいと思うでしょう。

processComponents(0,1,1970,0,0,0);

そしてとして 言及されたSDTOM, 、あなたはそれを確認したいと思うでしょう tm_isdst 適切に設定されています-0は有効ではなく、有効に陽性であり、あなたが知らない場合は否定的です(その場合はその場合 mktime() 推測してみてください)。

あなたに知らせるために、私があなたが持っている日付(1970年1月0日、00:00:00)を通過したとき mktime() MSVC 9では、エラーを返します(渡された struct tm 手つかずで返されます time_t 値は-1)。

他のヒント

1時間ずつオフになっているので、夏時間の節約時間を期待しています。 time.tm_isdstの値はどこかに設定されていますか?設定していない場合は、結果に影響を与えるとランダムに1または0に設定される可能性があります。

すべてのゼロを渡します mktime() 「1月0日0 00:00:00 1900」と解釈されます。これに基づいて、いくつかの調整が必要です...

// the input is local time
// the output is seconds since the epoch
// The epoch is Jan 1, 1970 @ 0:00 GMT
time_t mktime_wrapper( int month, int day, int year,
                       int hour=0, int min=0, int sec=0, bool isDST=-1
                     )
   {
   tm t;
   t.tm_sec=sec, t.tm_min=min, t.tm_hour=hour, t.tm_isdst=isDST;
   t.tm_mday=day, t.tm_mon=month-1, t.tm_year=year-1900;
   return mktime( &t );
   }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top