2016-12-05 8 views
2

의 이해할 수없는 행동 :strptime c-function이 구조를 변경하는 이유는 무엇입니까? 기능 <code>strptime()</code>의

#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 

왜 이런 일이 무엇입니까? mktime에 전달 될 때

컴파일러 GCC (GCC) 6.2.1 OS 리눅스

+1

'timeStampStart'의'tm_isdst' 멤버와'timeStampStop' 멤버를 -1로 초기화해야합니다. – user4815162342

+0

[GCC와 Clang에서 작동하는 것 같습니다] (http://coliru.stacked-crooked.com/a/6b54f234cc33eb6c) – AndyG

+0

@ user4815162342 : 오, 저 일광 절약 시간제는 항상 그런 고통입니다! 그리고 나는 당신이'tmStart'와'tmStop'을 의미한다고 생각합니다. – AndyG

답변

1

tmStarttmStop가 초기화되지는, 그래서 일부 필드는 초기화되지 않은 것입니다. 따라서 동작은 기술적으로 정의되지 않습니다. strptime 사람 페이지 (처음 두 문장 주)에서

: 원칙적으로

,이 기능은 TM을 초기화하지 않습니다 만 지정된 값을 저장합니다. 즉, 호출 전에 tm을 초기화해야합니다. 서로 다른 UNIX 시스템 간에는 세부 사항이 약간 다릅니다. glibc 구현은 명시 적으로 지정되지 않은 필드를 건드리지 않습니다. 단, 연도, 월 또는 요일 요소 중 하나라도 변경되면 tm_wdaytm_yday 필드를 다시 계산합니다.

+0

감사합니다. 흠뻑! – Sergey