2014-10-01 244 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