【问题标题】:Getting numeric timezone in specified format以指定格式获取数字时区
【发布时间】:2011-08-18 20:16:24
【问题描述】:

我想将当前时间打印为2011-08-18 10:11:12 -07:00。我开发了如下代码sn-p,

#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++ 中完成上述任务。

【问题讨论】:

    标签: c++ c unix date timezone


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您尝试的语法不存在。

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

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

        buf2[5]=buf2[4];
        buf2[4]=buf2[3];
        buf2[3]=':';
        
        strcat(buf,buf2);
        

        请注意,对于这些特定数据,布局不太可能发生变化,因此不会那么难看。

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

          • 您不应该对缓冲区中数据的长度做出任何假设。您需要事先将缓冲区归零,然后确定数据的末尾在哪里。
          • %z 不会改变,但问题是,如果是早上 7 点,%z 将移动一位。你的代码会失败。
          • 我觉得这是标准格式,如果是早上7点,会用07代替7。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多