2016-12-05 231 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

相關問題