以指定格式获取数字时区

时间:2011-08-18 20:16:24

标签: c++ c unix date timezone

我想将当前时间打印为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 ++中完成上述任务。

4 个答案:

答案 0 :(得分:3)

您必须手动将由%z格式化的字符串拆分为+hhmm-hhmm%z具有固定格式。查看description of strftime

  

以ISO 8601:2000标准格式(+ hhmm或-hhmm)与UTC的偏移量替换,如果没有可确定的时区则替换为无字符。

构建一个包含日期和时间的字符串。使用%z的UTC偏移量构建第二个字符串,在第二个字符串中插入:。连接第一个和第二个字符串。

答案 1 :(得分:1)

它试图解释%:并且它与格式说明符不匹配,因此它按原样打印出来。但你可能知道已经=)

在你的time_to_string函数中,我会在显示之前手动将':'插入缓冲区。

答案 2 :(得分:1)

您尝试的语法不存在。

我要做的是调用该函数两次:一次使用"%Y-%m-%d %H%M%S ",一次使用"%z",手动在第二个字符串中添加:,然后连接两个。< / p>

要插入:,你可以做一个丑陋的缓冲区操作:

buf2[5]=buf2[4];
buf2[4]=buf2[3];
buf2[3]=':';

strcat(buf,buf2);

请注意,此特定数据的布局不太可能发生变化,所以它并不那么难看。

0r如果你真的像矫枉过正,那就是正则表达式。但是你需要一个外部库。

答案 3 :(得分:0)

您可以在末尾手动添加“:”,修改结果字符串。如,

buf[26]='\0';
buf[25]=buf[24];
buf[24]=buf[23];
buf[23]=':';

我可能会忽略一个更好的解决方案。