2016-03-21 41 views
1
timeStruct @0x13b123b0 tm 
    tm_hour  0 int 
    tm_isdst 0 int 
    tm_mday  1 int 
    tm_min  0 int 
    tm_mon  0 int 
    tm_sec  33 int 
    tm_wday  4 int 
    tm_yday  0 int 
    tm_year  70 int 

這是我的結構,由QTcreators記憶手錶代表。mktime返回-1,但我期待我的tm結構是有效的

與此作爲參數的mktime()

struct tm *timeStruct; 
//[...] 
time_t timeOrigin = mktime(timeStruct); 

timeOrigin呼叫變爲-1。

這裏有很多問題問出來的一樣。

但他們都被提示得到解決,該tm_year字段不爲自1970年以來年,但年自1900年以來,我意識到這一點,也尊重它。

什麼混淆我進一步爲:

手冊頁想:http://linux.die.net/man/3/mktime

解釋mktime不改變結構的成員,如果它返回-1。在我的情況下,它確實在之前的情況下調整了tm_wdaytm_yday,而返回-1。

我不能閱讀標準錯誤,之後返回mktime藏漢-1找到有關這個任何錯誤。

那麼這裏發生了什麼?

+0

「如果指定的破舊時間不能被表示爲日曆時間(秒從epoch),mktime()返回(time_t的)-1和不改變破舊時間結構的成員」。但是,也許我從背景中讀出它。但無論如何,我的問題在於它。 – dhein

+0

現在我明白了:你錯誤地引用了它。 –

+0

@WeatherVane:所以它屬於不給我的上下文嗎? (在這種情況下,我會把這些信息拿出來) – dhein

回答

3

mktime返回-1,因爲tm結構值,解釋爲時間和日期在本地時間表示,會超出有效範圍。由於從該名男子頁引述:如果指定破舊的時間不能表示爲日曆時間(從epoch秒),mktime()回報(time_t)-1並不會改變破舊的時間結構的成員。

您可能位於格林威治東部,這意味着當地時間1970年1月1日0:00:00落在從1970年1月1日0:00:00開始的Unix Epoch開始之前。

+0

isdst標誌爲零,所以對於mktime這應該很重要,如果我理解它是正確的,所以在這個方向isn'這是否重要,是嗎? – dhein

+0

'isdst'(如果設置)*以及*本地時間調整。 –

+0

@Zaibis:'mdtime'作爲額外的信息來區分常規時間和夏令時,它可以在許多時區和地點選擇使用。實際上,在秋季切換回正常時間時,需要準確指出UTC時間模糊的1小時重疊。沒有將UTC分解時間轉換爲unix時間值的標準功能。 – chqrlie

0

mktime預計struct tm類型的指針,因爲它是第一個參數。

下面是一個例子,你如何使用它:

#include <stdio.h> 
#include <time.h> 

int main(void) 
{ 
    struct tm tm = *localtime(&(time_t){time(NULL)}); 
    printf("Today is   %s", asctime(&tm)); 
    tm.tm_mon -= 100; // tm_mon is now outside its normal range 
    time_t t = mktime(&tm); // recalculate tm 
    printf("100 months ago was %s", asctime(&tm)); 
} 
+0

我的時間結構是一個指針,我認爲這是自我解釋,因爲ot herwise我不得不這樣調用它:'mktime((struct tm *)timeStruct);'增加了它的澄清 – dhein

相關問題