在 Howard Hinnant 的日期库中获取毫秒级时间戳字符串的最佳方法是什么?

What is the best approach to get a millisecond-rounded timestamp string in Howard Hinnant's Date library?

我有以下代码,使用 Date 库:

#include "date.h"
#include <iostream>
#include <sstream>

using namespace date;
using namespace std::chrono;

int main()
{
    auto now = system_clock::now();
    std::stringstream ss;
    ss << now;
    std::string nowStr = ss.str();   // I need a string
    std::cout << nowStr << " UTC\n";
}

结果是:

2020-03-26 17:38:24.473372486 UTC

stringstream 是从 chrono::timepoint that now() returns 获取字符串的正确方法吗?而且,如果是这样,我如何将这些纳秒舍入到毫秒?

是的,ostringstream 是一个很好的方法。您也可以使用 date::format which returns a string,但这仍然在内部使用 ostringstream

string s = format("%F %T %Z", now);

无论使用哪种技术,您都可以在格式化之前通过将输入 time_point 截断为 milliseconds 来截断为 milliseconds 输出。您可以选择以下任何一种舍入模式:

  • 朝纪元日期舍入:time_point_cast<milliseconds>(now)
  • 绕过去:floor<milliseconds>(now)
  • 面向未来:ceil<milliseconds>(now)
  • 向最近的方向四舍五入(向平局方向):round<milliseconds>(now)

-

string s = format("%F %T %Z", floor<milliseconds>(now));

2020-03-26 17:38:24.473 UTC

在 C++20 中这将变为:

string s = format("{:%F %T %Z}", floor<milliseconds>(now));