将字符串转换为特定的日期格式
问题描述:
我有一个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吗?
答
的是这些情况之一,这里的只是走一个指针下来,原本datestring蛮力方法插入所需的日期和时间格式分隔符,与其他任何东西一样简单,高效。下面的代码简单地从原始字符串中构建一个缓冲区,将缓冲区中的格式插入适当的分隔符处,并将数据从data
复制到buf
所需的点,buf
中的索引只是从指针p
的位置派生而来。最后,在所有分隔符被插入并且所有字符被复制到buf
,buf
为nul-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'
看一下它,并让我知道如果您有任何问题。
答
我认为你正在使用位置和字符串连接的不必要的复杂路径。你最终会得到一堆难以理解的代码,并且可能存在隐藏的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
你正在使用哪种语言?你已经标记了C和C++。 – paddy
使用'std :: string :: substring()'和串联或'std :: ostringstream'。请展示你的一些努力。我们不是你们这里的“Gimme teh codez plz”购物中心。 –
或者,如果你有POSIX,你可以使用strptime()来解析并检查错误,然后使用strftime()来重新格式化。 –