【问题标题】:c++ - how to get timestamp string both on Linux and windowsc++ - 如何在 Linux 和 Windows 上获取时间戳字符串
【发布时间】:2014-09-05 05:09:28
【问题描述】:

我有以下功能:

string myClass::get_timestamp()
{
  string res = "";

  time_t rawtime;
  struct tm * timeinfo;
  char buffer [80];

  time (&rawtime);
  timeinfo = localtime (&rawtime);

  // Wednesday, March 19, 2014 01:06:18 PM
  strftime (buffer,80,"%A, %B %d, %Y %r",timeinfo);

  res = buffer;
  return res;
}

此函数在 Linux 和 Windows 上编译良好。然而,当我在 Linux 上运行预期的字符串时,我得到一个在 Windows 上运行的 empty string。 有什么想法吗?

注意事项
timeinfo 有效。我可以访问它的成员并验证它的值是否正确
buffer 在调用strftime() 后为空

【问题讨论】:

    标签: c++ timestamp cross-platform strftime


    【解决方案1】:

    strftime 是一个库(不是操作系统)函数,因此行为取决于您要链接的确切库。 [你的问题没有说。 ]

    并非所有平台都支持您在 strftime 格式字符串中使用的所有说明符,因为其中一些是在 C99 中引入的,并且在 C++11 之前是可选的。

    例如,http://www.cplusplus.com/reference/ctime/strftime/ 是这样说的:

    兼容性 特定的库实现可能支持额外的说明符或组合。 此处列出的内容受最新的 C 和 C++ 标准(均于 2011 年发布)支持,但黄色的内容是在 C99 中引入的(仅 C++11 以来的 C++ 实现需要),并且可能不受符合以下标准的库支持旧标准。

    “黄色”C99 说明符是:%C, %D %e %F %g %G %h %n %r %R %t %T %u %V %Z 以及修饰符 E 和 O。

    一些基于 Linux 的嵌入式平台也不支持上面网页上描述为“黄色”的所有说明符。

    在您的情况下, %r 是这些较新的说明符之一,因此 strftime 很可能由于您的特定运行时库而失败。

    您还应该检查 strftime 的返回值,看看它是否提供任何额外的数据。

    因此,请仅使用较旧的格式说明符:

    // Wednesday, March 19, 2014 01:06:18 PM
    strftime (buffer,80,"%A, %B %d, %Y %I:%M:%S %p",timeinfo);
    

    【讨论】:

      【解决方案2】:

      MS 的strftime 似乎不支持"%r",这可能就是问题所在。它确实支持"%p" 显示“当前语言环境格式的上午/下午”,所以在大多数情况下应该做同样的事情。

      我没有 Windows 机器来测试这个,但这是我能看到的唯一突出的东西。

      始终检查返回值,如果它为零(并且您没有将空字符串传递给strftime),则打印errno 的值以了解问题所在。

      【讨论】:

      • 是的,VC++ 实现了 C89,而不是 C99。 %r 的替换是 %I:%M:%S %p
      • 感谢您的宝贵时间。效果很好。 @BitBlitz 在 1 分钟内击败你。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      相关资源
      最近更新 更多