簡體   English   中英

mktime()的奇怪行為

[英]Odd behavior of mktime()

繼續嘗試創建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日凌晨processComponents(5,5,1990,1,23,45) ),它將正確並按預期設置所有值。

但是,在進一步測試中,我發現對於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的日期。

我可以驗證mktime()是負責任的,因為通過注釋掉該行,它可以正確地將日期和時間報告為1970年1月1日上午12:00:00。

為什么mktime()只會搞亂紀元? 我應該如何解決/解決這個問題?

謝謝!

您將傳遞0作為day參數,並將其放入time.tm_mday struct tm該組件(並且僅該組件)基於1,而不是基於0。

不要問我為什么。

要指定1970年1月1日上午12:00:00,您可以這樣稱呼它:

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

正如sdtom所述 ,您將要確保tm_isdst設置了tm_isdst -0表示無效,正數表示有效,而負數表示您不知道(在這種情況下, mktime()應該嘗試猜測)。

只是讓您知道,當我在MSVC 9中將日期(1970年1月0日,00:00:00)傳遞給mktime() ,它會返回錯誤(未傳遞傳入的struct tm ,並且返回的time_t值為- 1)。

由於關閉一小時,我希望可以節省夏令時。 time.tm_isdst的值是否設置在某處? 如果未設置,則可能會隨機將其設置為1或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 );
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM