2016-04-26 69 views
0

我是c新手,嘗試使用strptime函數,該函數將字符串時間轉換爲結構tm。轉換後,我沒有得到正確的時間。一切都很好,但一年顯示錯誤(默認年份爲1900)。strptime不適用於時區格式說明符

#include <stdio.h> 
#include <time.h> 
#include <string.h> 
#include <ctype.h> 

int main() 
{ 
    struct tm tm; 
    char *pszTemp = "Mon Apr 25 09:53:00 IST 2016"; 
    char szTempBuffer[256]; 

    memset(&tm, 0, sizeof(struct tm)); 
    memset(szTempBuffer, 0, sizeof(szTempBuffer)); 
    strptime(pszTemp, "%a %b %d %H:%M:%S %Z %Y", &tm); 
    strftime(szTempBuffer, sizeof(szTempBuffer), "%Y-%m-%d %H:%M:%S", &tm); 

    printf("Last Boot Time after parsed = %s\n", szTempBuffer); 

    return 0; 
} 

輸出:1900年4月25日9時53分○○秒

+1

你檢查了什麼['strptime'](http://man7.org/linux/man-pages/man3/strptime.3.html)返回?這樣它不會返回一個NULL指針? –

+0

您是否嘗試使用'-Wall'選項進行編譯? – LPs

+0

@LP:它沒有工作。 –

回答

1

正如你可以看到爲time.h源文件必須聲明__USE_XOPEN_GNU_SOURCE之前包括time.h

#define __USE_XOPEN 
#define _GNU_SOURCE 

#include <stdio.h> 
#include <time.h> 
#include <string.h> 
#include <ctype.h> 

int main() 
{ 
    struct tm tm; 
    char *pszTemp = "Mon Apr 25 09:53:00 IST 2016"; 
    char szTempBuffer[256]; 

    memset(&tm, 0, sizeof(struct tm)); 
    memset(szTempBuffer, 0, sizeof(szTempBuffer)); 
    strptime(pszTemp, "%a %b %d %H:%M:%S %Z %Y", &tm); 
    strftime(szTempBuffer, sizeof(szTempBuffer), "%Y-%m-%d %H:%M:%S", &tm); 

    printf("Last Boot Time after parsed = %s\n", szTempBuffer); 

    return 0; 
} 

您還可以簡單地將定義添加到您的gcc命令中:

gcc -Wall test.c -o test -D__USE_XOPEN -D_GNU_SOURCE 

編輯

This historical SO post提供有關這些定義了所有的相關信息。

+1

你能解釋爲什麼這是必要的嗎?編輯:謝謝。 – 2501

+0

@ 2501 [This historical SO post](http://stackoverflow.com/questions/5378778/what-does-d-xopen-source-do-mean)給出了關於這些定義的所有信息。 – LPs

+0

它沒有工作。得到相同的輸出。 –

0

%Z不適用於strptime,只適用於strftime。 %Z後,strptime停止閱讀。因此2016年不見了。

http://linux.die.net/man/3/strptime

如果您使用的glibc它應該工作。

+0

在%Z和2016的位置上玩一下,你可以看到它 – kbnl83