我想将当前时间打印为2011-08-18 10:11:12 -07:00
。我编写了如下代码片段
#include <iostream>
using namespace std;
void time_to_string(time_t clock,const char *fmtstr )
{
char buf[256];
if (strftime(buf, 256, fmtstr, localtime(&clock)) == 0)
buf[0] = 0;
cout << buf << endl;
}
int main()
{
time_to_string(time(NULL), "%Y-%m-%d %H%M%S %z");
}
我能够将时间显示为2011-08-18 10:11:12 -0700
而不是2011-08-18 10:11:12 -07:00
。用"%Y-%m-%d %H%M%S %:z"
生成2011-08-18 10:11:12 %:z
如何在C/c++中完成上述任务
您必须手动将%z
格式化的字符串分割为+hhmm
或-hhmm
。%z
有固定的格式。查看strftime的描述。
以ISO 8601:2000标准格式(+hhmm或-hhmm)替换与UTC的偏移量,如果无法确定时区,则不使用字符。
创建一个包含日期和时间的字符串。用%z
与UTC的偏移量构建第二个字符串,在第二个字符串中插入:
。连接第一个和第二个字符串
它试图解释%:并且它不匹配格式说明符,所以它原样打印出来。但是你可能已经知道了=)
在time_to_string函数中,我会在显示它之前手动插入':'到缓冲区中。
您尝试的语法不存在。
我要做的是调用函数两次:一次是"%Y-%m-%d %H%M%S "
,一次是"%z"
,在第二个字符串中手动添加:
,然后将两者连接起来。
要插入:
,您可以做一个难看的缓冲区操作:
buf2[5]=buf2[4];
buf2[4]=buf2[3];
buf2[3]=':';
strcat(buf,buf2);
请注意,布局不太可能为这个特定的数据改变,所以它不是那么难看。
0或者如果真的喜欢过度使用,则使用regexp。但是你需要一个外部库
您可以手动在末尾添加':',修改结果字符串。例如,
buf[26]=' ';
buf[25]=buf[24];
buf[24]=buf[23];
buf[23]=':';
我可能忽略了一个更好的解决方案。