2011-10-26 103 views
0

我試圖用strptime(buf, &pattern,&result)char[]包含日期轉換爲tm結構。strptime中元素的順序

我使用的功能是這樣的:

if(strptime(buf, &pattern,&result) == NULL) 
    { 
     printf("\nstrptime failed\n"); 
... 

如果我的變量是這樣定義的一切工作:

char buf[] = "26/10/2011"; 
char pattern[] = "%d/%m/%y"; 
struct tm result; 

,但如果我改變其劃分爲:

char buf[] = "2011/26/10"; 
char pattern[] = "%y/%d/%m"; 
struct tm result; 

我得到「strptime失敗」。請注意,我只在年初開始(在bufpattern之間)。

幫助讚賞。我的最終目標是將字符串轉換格式爲:2011-10-26T08:39:21

+0

你確定你在這裏正確地複製了代碼嗎?變量'pattern'不應該在調用'strptime'時使用地址 - 運算符。 –

回答

3

這是因爲較低的情況下%y對於兩位數的年份世紀。嘗試將其改爲大寫%Y,它會工作正常。您可以從下面的程序看到這一點:

#include <stdio.h> 
#include <time.h> 
int main (void) { 
    char buf[] = "26/10/2011"; 
    char pattern[] = "%d/%m/%y"; 
    struct tm result; 
    if (strptime (buf, pattern, &result) == NULL) { 
     printf("strptime failed\n"); 
     return -1; 
    } 
    printf ("%d\n", 1900 + result.tm_year); 
    return 0; 
} 

此輸出2020,這意味着一年被理解爲只是201120部分,其餘部分被忽略。如果使用大寫字母%Y,則會輸出正確的2011。在使用反轉格式生成轉換錯誤

代碼:

#include <stdio.h> 
#include <time.h> 
int main (void) { 
    char buf[] = "2011/10/26"; 
    char pattern[] = "%y/%m/%d"; 
    struct tm result; 
    if (strptime (buf, pattern, &result) == NULL) { 
     printf("strptime failed\n"); 
     return -1; 
    } 
    printf ("%d\n", 1900 + result.tm_year); 
    return 0; 
} 

將正常工作(即輸出2011)當您更改pattern"%Y/%m/%d"

+0

+1嘗試'%Y'而不是'%y'。 – cnicutar

+0

aaah,這樣的錯字...我討厭它。只是爲了確定,沒關係,我得到'tm_mon:9'而不是10? –

+1

它在標準中:'int tm_mon年份[0,11]'的月份。所以1月份是'0',而不是'1'。 – cnicutar

0

用我自己的 'strptime' 和 '時間戳' 命令,我得到:

$ strptime -T '%y/%d/%m' 2011/26/11 
strptime: failed to convert <2011/26/11> using format <%y/%d/%m> 
$ strptime -T '%Y/%d/%m' 2011/26/11 
1322294400 = 2011/26/11 
$ strptime -T '%d/%m/%y' 26/11/2011 
1606377600 = 26/11/2011 
$ timestamp 1322294400 1606377600 
1322294400 = Sat Nov 26 00:00:00 2011 
1606377600 = Thu Nov 26 00:00:00 2020 
$ 

(一次在這裏區是美國/太平洋,當前UTC-7)。

注意,'%d/%m/%y'格式在2020年產生一個日期,而不是在2011年。