2014-10-01 242 views
3
#include <stdio.h> 
#include <time.h> 
#include <string.h> 

void main() { 
     struct tm tm; 
     memset (&tm, '\0', sizeof(tm)); 
     if (!strptime ("15/Sep/2014:16:00:00 +0300", "%d/%b/%Y:%H:%M:%S%t%z", &tm)) { 
       perror("strptime"); 
       return; 
     } 

     time_t gmt = timegm (&tm); // or mktime(), not relevant here 
     printf("%d gmtoff=%lu %s %lu\n", tm.tm_hour, tm.tm_gmtoff, tm.tm_zone, gmt); 

} 

結果:strptime tm_gmtoff始終爲零

16 gmtoff=0 GMT 1410796800 

我預計gmtoff爲3。

這就像strptime以某種方式解析偏移,因爲它成功,但它不補在結構中偏移。我已經嘗試過任何形式的字符串和日期時間字符串的變體,但沒有運氣。

根據http://lxr.devzen.net/source/xref/glibc/time/strptime_l.c#751應該修改struct字段。

+1

調用'timegm()'之前'tm.tm_gmtoff' *的值是多少? – unwind 2014-10-01 09:42:50

+0

您正在使用memset來初始化包含任意數據的數據結構。雖然字符文字''\ 0''應該等於整數值'0'(轉換後),但我認爲使用實際整數值'0'而不是字符文字更明智。 – 2014-10-01 09:46:13

+0

@unwind 10800,很好的接...所以我應該使用mktime(),我錯誤地認爲tm沒有被timegm感動。現在我必須理解爲什麼mktime()在我的程序中泄漏,而使用timegm()不會。 – lethalman 2014-10-01 09:52:33

回答

0

根據http://lxr.devzen.net/source/xref/glibc/time/strptime_l.c#751應該修改struct字段。

它是。實際上,它修改了兩次。太好了!爲了證明這一點給自己,你可以在一個與timegm前加入這一行:

printf("%lu\n", tm.tm_gmtoff); 

你會發現,gmtoff後前位和timegm行之後是不同的。 timegm正在修改你傳入的結構。在它被調用之前,你會得到你期望的值;事後,你是......不是。

現在,我找不到任何有關此特定功能的文檔。像這樣的事情是爲什麼我更喜歡使用標準功能,如mktime;這是一個更多的代碼,但是每個函數的功能都非常好。

+0

是的,我意識到這個問題很舊。這是這個答案的一部分;我強烈不喜歡舊的,主題上沒有答案的問題。 – 2017-04-09 01:17:22