将 std::chrono::milliseconds 转换为 ISO 8601 字符串
Convert std::chrono::milliseconds to ISO 8601 string
我有一个 std::chrono::milliseconds
表示纪元 unix 时间(以毫秒为单位)。我需要将它转换成符合 ISO 8601 格式的字符串,例如 2020-02-25T00:02:43.000Z
.
使用 date 库我能够解析它,使用以下 GetMillisecondsFromISO5601String
方法:
#include "TimeConversion.hpp"
#include <date/date.h>
using std::string;
using std::string_view;
using std::chrono::milliseconds;
string TimeConversion::GetISO8601TimeStringFrom(const milliseconds& ms) {
std::stringstream ss;
date::to_stream(ss, "%FT%T%z", ms);
return ss.str();
}
milliseconds TimeConversion::GetMillisecondsFromISO5601String(string_view s) {
std::istringstream in{ std::move(string(s)) };
in.exceptions(std::ios::failbit);
date::sys_time<milliseconds> tp;
if (*s.rbegin() == 'z') {
in >> date::parse("%FT%T%z", tp);
}
else if (*s.rbegin() == 'Z') {
in >> date::parse("%FT%T%Z", tp);
}
else {
in >> date::parse("%FT%T%", tp);
}
return tp.time_since_epoch();
}
如何进行逆向操作?如您所见,我在 GetISO8601TimeStringFrom
方法中尝试 to_stream
但没有任何结果(returns 我是一个空字符串)。
问题是您将时间 duration
(milliseconds
) 视为 time_point
(time_point<system_clock, milliseconds>
)。您需要做的就是使用显式转换语法将 duration
转换为 time_point
。 date lib 对此类型有一个方便的类型别名:sys_time<milliseconds>
:
string TimeConversion::GetISO8601TimeStringFrom(const milliseconds& ms) {
date::sys_time<milliseconds> tp{ms};
// continue using tp ...
您也可以使用更方便的 format
函数代替 to_stream
:
string TimeConversion::GetISO8601TimeStringFrom(const milliseconds& ms) {
return date::format("%FT%T%z", date::sys_time<milliseconds>{ms});
}
我有一个 std::chrono::milliseconds
表示纪元 unix 时间(以毫秒为单位)。我需要将它转换成符合 ISO 8601 格式的字符串,例如 2020-02-25T00:02:43.000Z
.
使用 date 库我能够解析它,使用以下 GetMillisecondsFromISO5601String
方法:
#include "TimeConversion.hpp"
#include <date/date.h>
using std::string;
using std::string_view;
using std::chrono::milliseconds;
string TimeConversion::GetISO8601TimeStringFrom(const milliseconds& ms) {
std::stringstream ss;
date::to_stream(ss, "%FT%T%z", ms);
return ss.str();
}
milliseconds TimeConversion::GetMillisecondsFromISO5601String(string_view s) {
std::istringstream in{ std::move(string(s)) };
in.exceptions(std::ios::failbit);
date::sys_time<milliseconds> tp;
if (*s.rbegin() == 'z') {
in >> date::parse("%FT%T%z", tp);
}
else if (*s.rbegin() == 'Z') {
in >> date::parse("%FT%T%Z", tp);
}
else {
in >> date::parse("%FT%T%", tp);
}
return tp.time_since_epoch();
}
如何进行逆向操作?如您所见,我在 GetISO8601TimeStringFrom
方法中尝试 to_stream
但没有任何结果(returns 我是一个空字符串)。
问题是您将时间 duration
(milliseconds
) 视为 time_point
(time_point<system_clock, milliseconds>
)。您需要做的就是使用显式转换语法将 duration
转换为 time_point
。 date lib 对此类型有一个方便的类型别名:sys_time<milliseconds>
:
string TimeConversion::GetISO8601TimeStringFrom(const milliseconds& ms) {
date::sys_time<milliseconds> tp{ms};
// continue using tp ...
您也可以使用更方便的 format
函数代替 to_stream
:
string TimeConversion::GetISO8601TimeStringFrom(const milliseconds& ms) {
return date::format("%FT%T%z", date::sys_time<milliseconds>{ms});
}