1

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 秒) に対して、すべての値が正しく期待どおりに設定されます。

processComponents(0,0,1970,0,0,0)ただし、さらにテストすると、 for (January 1, 1970, 12:00:00 am) の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 の日付に変換します。

mktime()その行をコメントアウトすることで、日付と時刻が 1970 年 1 月 1 日午前 12:00:00 として正しく報告されるため、それが原因であることを確認できます。

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

ありがとう!

4

3 に答える 3

5

パラメータとして 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 です)。

于 2009-11-08T06:12:15.620 に答える
3

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

于 2009-11-08T04:52:35.407 に答える
0

にすべてゼロを渡すmktime()と、「Sun Jan 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 );
   }
于 2012-12-21T02:27:16.543 に答える