2016-12-05 192 views
2

功能strptime()的莫名其妙的行为:为什么strptime c函数会改变结构?

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

double getPeriod(char * dateStart, char * dateStop) { 
    struct tm tmStart, tmStop; 
    time_t timeStampStart, timeStampStop; 

    strptime(dateStart, "%Y-%m-%d %H:%M:%S", &tmStart); 
    strptime(dateStop, "%Y-%m-%d %H:%M:%S", &tmStop); 

    timeStampStart = mktime(&tmStart); 
    timeStampStop = mktime(&tmStop); 

    printf("%d\t%d\n", tmStart.tm_hour, tmStop.tm_hour); 
} 

int main() 
{ 
    getPeriod("2016-12-05 18:14:35", "2016-12-05 18:18:34"); 
    return 0; 
} 

输出:

17 18 

为什么会出现这种情况?

编译器GCC(海湾合作委员会)6.2.1 OS的Linux

+1

您需要将timeStampStart和timeStampStop的'tm_isdst'成员初始化为-1。 – user4815162342

+0

[似乎对GCC和工作锵这里(http://coliru.stacked-crooked.com/a/6b54f234cc33eb6c) – AndyG

+0

@ user4815162342:哦,是夏令时的事情总是这样的痛苦!我觉得你的意思了'tmStart'和'tmStop' – AndyG

回答

1

tmStarttmStop不会被初始化,所以一些领域将被传递给mktime时初始化。因此,行为在技术上是不确定的。

strptime手册页(注意开头两句):

原则上,此功能不会初始化TM,但只存储指定的值。这意味着tm应在呼叫之前初始化。不同UNIX系统之间的细节有点不同。 glibc实现不会触及那些未明确指定的字段,除非它在年,月或日元素中的任何一个发生更改时重新计算tm_wdaytm_yday字段。

+0

谢谢非常! – Sergey

相关问题