2016-03-23 45 views
-2

從time.h中庫mktime沒有轉換到正確的日期,爲什麼?

tm Tm; 
Tm.tm_year = 46; 
Tm.tm_mon = 3-1; // since month start with zero 
Tm.tm_mday = 23; 
Tm.tm_hour = 9; 
Tm.tm_min = 3; 
Tm.tm_sec = 38; 

uint32_t epoch = mktime(&Tm); 

epoch使用標準mktime()函數是1458651818 要:http://www.epochconverter.com並輸入1458651818

輸出:

星期二2016年3月22日9點03分38秒AM EDT GMT-4:00 DST

我在設置日Tm.tm_day = 23;,而不是22,爲什麼我的時代轉換爲第23?推薦的解決方法是什麼?

+0

那麼,首先,你想time_t,而不是uint32_t .. –

+0

什麼是'Tm'類型?它是'struct tm'的別名嗎? –

+1

至於你的問題,'tm_isdst'成員的價值是什麼?也許你應該初始化它? –

回答

0

C語言不指定劃時代一年留給了庫的實現。我假設EPOCH是1970年,但是我使用的特定圖書館將它們的時代設定爲1900年。這解決了這個問題。

4

我不確定你期待什麼答案。

我假設你的Tm類型實際上是一個struct tm

當您設置

Tm.tm_year = 46; 

你所要求的一年1946年

當您設置

Tm.tm_mon = 3; 

你所要求的四月。 (tm_mon是基於0)。

我假設你的意思

Tm.tm_mday = 23; 

(沒有tm_day成員struct tm。)

正如約阿希姆Pileborg提到,呼籲mktime你應該當最好的結果也設置

Tm.tm_isdst = -1; 

最後,大多數系統測量自1970年以來的時間。因此,1946年是一個負面的時間。因此,當您將mktime的返回值分配給未簽名的epoch變量時,您將無法得到正確的答案。

當我修改代碼以分配mktime的返回值的變量time_t,並打印出來,像這樣:

time_t epoch = mktime(&Tm); 
printf("%ld\n", (long)epoch); 

我得到-747654982,這是我的期望。 (我在美國東部時間;如果你在不同的時區,你會得到一個稍微不同的值。)

如果你想計算今天的日期的time_t(「epoch」)值, 2016,使用

Tm.tm_year = 2016 - 1900; 

(它會給它的值116)。

還有一個問題:你是肯定是當你運行這個代碼時它計算得出epoch爲1458651818? 1458651818對應於昨天!它與1946年無關,也不是我所期望的基於你的uint32_t錯誤的答案。

(順便說一句,你使用的是什麼系統?並非所有系統都一定使用的1970年基準年)

+0

另一個注意:'mktime()'期望_all_字段,除了'tm_wday'和'tm_yday'被初始化。 'struct tm'有至少9個字段 - 也許更多。最好填零所有'tm Tm = {0};'然後根據需要填寫各個字段 - 在調用mktime()之前。然後檢查其結果爲-1。 – chux

+0

@chux檢查其結果是否爲-1,並希望您嘗試轉換的日期不是1969年12月31日的23點59分59秒。:-)(但是您說得對,當然。) –