質問
続行 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 );
}