2012-08-16 52 views
1

我必須從現在開始找到4,000,000秒的日期。如果我添加4,000,000到secondsSince1970,我可以得到正確的答案,但我想知道爲什麼如果向now.tm_sec添加4,000,000,它爲什麼不起作用?C中的時間函數?

int main(int argc, const char * argv[]) 
{ 
    long secondsSince1970 = time(NULL) + 4000000; 

    struct tm now; 

    localtime_r(&secondsSince1970, &now); 

    printf("The date from 4,000,000 seconds from now is %i-%i-%i\n", now.tm_mon + 1, now.tm_wday, now.tm_year + 1900); 
} 

輸出: 的日期是2012年10月1日


int main(int argc, const char * argv[]) 
{ 
    long secondsSince1970 = time(NULL); 

    struct tm now; 

    localtime_r(&secondsSince1970, &now); 
    now.tm_sec += 4000000; 

    printf("The date from 4,000,000 seconds from now is %i-%i-%i\n", now.tm_mon + 1, now.tm_wday, now.tm_year + 1900); 
} 

輸出:日期是2012年8月4日

+0

啊好吧,它似乎是問同樣的事情,但。 – Annabelle 2012-08-16 16:17:55

回答

5

struct tm只是一堆的變數由localtime_r填寫。呼叫localtime_r後,分配給其中一個變量不會奇蹟般地使其他變量的值更改爲值。

0

這是不正確的做到這一點:

now.tm_sec += 4000000; 

您tm_sec必須是0和59之間(60閏秒)。

你需要做的是這樣的:

now.tm_sec += 4000000; 
now.tm_min += now.tm_sec/60; now.tm_sec %= 60; 
now.tm_hour += now.tm_min/60; now.tm_min %= 60; 
etc. 
+1

但是,一旦你得到了幾個月和幾年,它就不那麼簡單了,因爲幾個月和幾年有不同的長度,先驗你可以跳過任何數量。唯一合理的解決方案是將時間轉換回unix,然後_then_算術,最後再次轉換爲ymdhms。 – 2012-08-16 16:18:34

+0

@亨寧馬克姆霍爾姆:因此我的「等」 :) – user1202136 2012-08-16 16:30:30

2

添加值tm_sec只不過是修改的now整數成員。最簡單的做法是將struct tm轉換成mktime,將其轉換爲time_t。然後對結果值調用localtime_r

void 
add_seconds(struct tm* broken, int num_seconds) { 
    time_t then; 
    broken->tm_sec += num_seconds; 
    then = mktime(broken); 
    localtime_r(&then, broken); 
} 

int 
main(int argc, char const* argv[]) { 
    time_t secondsSince1970 = time(NULL); 
    struct tm now; 
    localtime_r(&secondsSince1970, &now); 
    add_seconds(&now, 4000000); 
    printf("The date at 4,000,000 seconds from now is %i-%i-%i\n", 
      now.tm_mon + 1, now.tm_mday, now.tm_year + 1900); 
    return EXIT_SUCCESS; 
} 
+0

對不起,如果這個問題是愚蠢的。我認爲訪問和分配成員的結構變量的方法是聲明結構變量名稱,後面跟着一個點,成員的名稱,然後爲它賦值= =? – stumped 2012-08-16 16:25:36

+1

@stumped:在這個代碼示例中,您有指向結構的指針而不是結構本身。所以原則上你會寫'(* broken).tm_sec = ...'來分配一個成員。然而,'(* abc).def'結構非常常見,它有一個簡短的縮寫語言,即'abc-> def'。 – 2012-08-16 19:17:45

+0

感謝您的回答!但是,我不明白我是如何在'now'前面使用*號的時候聲明一個指向結構體的指針? – stumped 2012-08-16 19:26:21