将字符串转换为特定的日期格式

时间:2016-09-19 22:19:33

标签: c string parsing datetime

我有一个包含此数据{14}的14位数字符串,我想将其转换为此格式20161909132409所以它看起来像:YYYY-dd-mm hh:mm:ss,但我不知道如何要做到这一点,有人可以帮我提供代码吗?

2016-19-09 13:24:09

有人可以知道如何使用strcat函数添加deliminator吗?

2 个答案:

答案 0 :(得分:3)

我认为你使用位置和字符串连接来走下一条不必要的复杂路径。您最终会遇到很多难以理解的代码,并且可能存在隐藏的错误。

使用占位符为要插入的字符简单地创建位置格式字符串会更加清晰。这样就可以了:

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;
}

答案 1 :(得分:1)

这是其中一种情况,其中简单地将指针向下移动到原始日期字符串以插入所需的日期和时间格式分隔符的蛮力方法,就像其他任何东西一样简单,高效。以下代码只是从原始字符串构建一个缓冲区,在适当的分隔符中将缓冲区中的格式插入到所需的点,因为数据从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'

仔细看看,如果您有任何问题,请告诉我。