2016-09-19 119 views
2

我有一個14位數字的字符串與此數據20161909132409,我想將其轉換爲這種格式YYYY-dd-mm hh:mm:ss所以它看起來像:2016-19-09 13:24:09,但我不知道該怎麼做,有人可以幫我用代碼嗎?將字符串轉換爲特定的日期格式

char * strA = "00000000000000", * strB = "-", strC[50]; 
    int x = 4; 
    strncpy(strC,strA,x); 
    strC[x]= '\0'; 
    strcat(strC,strB); 
    strcat(strC,strA+x); 
    printf("%s\n",strC); 
    return 0; 

有人可以給出一個想法,如何添加帶有strcat函數的deliminator嗎?

+3

你正在使用哪種語言?你已經標記了C和C++。 – paddy

+0

使用'std :: string :: substring()'和串聯或'std :: ostringstream'。請展示你的一些努力。我們不是你們這裏的「Gimme teh codez plz」購物中心。 –

+1

或者,如果你有POSIX,你可以使用strptime()來解析並檢查錯誤,然後使用strftime()來重新格式化。 –

回答

1

的是這些情況之一,這裏的只是走一個指針下來,原本datestring蠻力方法插入所需的日期和時間格式分隔符,與其他任何東西一樣簡單,高效。下面的代碼簡單地從原始字符串中構建一個緩衝區,將緩衝區中的格式插入適當的分隔符處,並將數據從data複製到buf所需的點,buf中的索引只是從指針p的位置派生而來。最後,在所有分隔符被插入並且所有字符被複制到buf,bufnul-terminated並且沒有以傳遞給你的日期函數的形式。

#include <stdio.h> 

int main (void) { 

    char data[] = "20161909132409", 
     buf[32] = "", *p = buf; 
    size_t i = 0; 

    for (; data[i]; i++) { 
     if (i < 4) *p++ = data[i]; 
     else if (i == 4) { *p++ = '-'; *p++ = data[i]; } 
     else if (i < 6) *p++ = data[i]; 
     else if (i == 6) { *p++ = '-'; *p++ = data[i]; } 
     else if (i < 8) *p++ = data[i]; 
     else if (i == 8) { *p++ = ' '; *p++ = data[i]; } 
     else if (i < 10) *p++ = data[i]; 
     else if (i == 10) { *p++ = ':'; *p++ = data[i]; } 
     else if (i < 12) *p++ = data[i]; 
     else if (i == 12) { *p++ = ':'; *p++ = data[i]; } 
     else if (i < 14) *p++ = data[i]; 
    } 
    *p = 0; /* nul-terminate */ 

    printf (" original : '%s'\n formatted : '%s'\n", data, buf); 

    return 0; 
} 

示例使用/輸出

$ ./bin/fmrdatestr 
original : '20161909132409' 
formatted : '2016-19-09 13:24:09' 

看一下它,並讓我知道如果您有任何問題。

3

我認爲你正在使用位置和字符串連接的不必要的複雜路徑。你最終會得到一堆難以理解的代碼,並且可能存在隱藏的bug。

使用佔位符爲您想要插入的字符簡單地生成一個位置格式字符串更爲清晰。這將這樣的伎倆:

char *format_date(char date[20], const char *input) 
{ 
    const char format[20] = "XXXX-XX-XX XX:XX:XX"; 
    for(int i = 0; i < 20; i++) 
    { 
     if(*input && format[i] == 'X') 
      date[i] = *input++; 
     else 
      date[i] = format[i]; 
    } 
    return date; 
} 

而且您現在可以重新使用它:

int main(void) 
{ 
    char date[20]; 

    /* simple example */ 
    format_date(date, "20161909132409"); 
    printf("%s\n", date); 

    /* in-place example */ 
    printf("%s\n", format_date(date, "20161909132409")); 
    printf("%s\n", format_date(date, "20161012131415")); 

    return 0; 
} 
+0

不錯!比我的建議更清潔 – yano

相關問題