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

der*_*mai 4 c++ time date c++11 c++-chrono

我有以下代码,使用日期库:

#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";
}
Run Code Online (Sandbox Code Playgroud)

结果是:

2020-03-26 17:38:24.473372486 UTC
Run Code Online (Sandbox Code Playgroud)

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

How*_*ant 5

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

string s = format("%F %T %Z", now);
Run Code Online (Sandbox Code Playgroud)

使用任何一种技术,您都可以milliseconds通过在格式化之前截断输入time_point来截断输出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
Run Code Online (Sandbox Code Playgroud)

在 C++20 中,这将变成:

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