2016-02-19 28 views
1

我有這樣的:相同mktime()導致了不同的時間字符串

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

int main() 
{ 
    struct tm timeinfo; 

    strptime("2016-02-18 09:00:00", "%Y-%m-%d %H:%M:%S", &timeinfo); 
    printf("result 1=%ld\n", mktime(&timeinfo)); 

    strptime("2016-02-18 08:00:00", "%Y-%m-%d %H:%M:%S", &timeinfo); 
    printf("result 2=%ld\n", mktime(&timeinfo)); 
} 

此MCVE結果讓我發瘋:

result 1=1455778800 
result 2=1455778800 

1455778800是UTC時間爲2016-02-18 07:00:00所以這將是糾正第二個日期時間字符串。但爲什麼我會得到兩個不同的字符串相同的結果?

現在這個:

{ 
    struct tm timeinfo; 

    strptime("2016-02-18 08:00:00", "%Y-%m-%d %H:%M:%S", &timeinfo); 
    printf("result 2=%ld\n", mktime(&timeinfo)); 
    strptime("2016-02-18 09:00:00", "%Y-%m-%d %H:%M:%S", &timeinfo); 
    printf("result 1=%ld\n", mktime(&timeinfo)); 
} 

在這裏,我有這樣的結果:

result 2=1455775200 
result 1=1455782400 

result 1現在是正確的,但result 2是一個小時爲時尚早。看起來內部glibc結構在第一次調用時沒有正確初始化。

我將它與另一個glibc版本鏈接比系統正在使用。當我將它與系統版本鏈接時,它就可以工作。我做錯了什麼?

+0

我無法在OS X上使用鏗鏘700.1.81複製你的結果。我處於與你不同的時區。你似乎在中歐時間?這可能會導致問題。嘗試使用'timegm'而不是'mktime'來消除時區。你可以驗證你的時區嗎?你也應該手動打印'&timeinfo'來驗證'strptime'或'mktime'是否有問題。 – Schwern

回答

4

OK,該解決方案是在man網頁:

原則上,此功能不會初始化TM,但只存儲 指定的值。這意味着tm應該在調用之前初始化爲
。不同的UNIX
系統之間的細節有點不同。 glibc的實現不會觸及那些沒有明確指定的字段,只是它會重新計算tm_wday
和tm_yday字段,如果有任何年份,月份或日期元素髮生了變化。

bzero(&timeinfo, sizeof(timeinfo));現在它工作。

+0

或'struct tm timeinfo = {0};' – chux

+0

@chux我正在使用'-Wall -Wextra -Werror',這對'gcc'不起作用。有很多「舊」結構,我必須使用'bzero()'初始化'' –

+0

許多方法來零數據。由於未定義'struct tm'的總字段數,'bzero()'比試圖將單個字段置零要好。好,它適合你。 – chux

相關問題