在 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));
我有以下代码,使用 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));