问题描述
我有一个 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();
}
我怎样才能做相反的事情?如您所见,我在 to_stream
方法中尝试了 GetISO8601TimeStringFrom
,但没有任何结果(它返回一个空字符串)。
解决方法
问题在于您将时间 duration
(milliseconds
) 视为 time_point
(time_point<system_clock,milliseconds>
)。您需要做的就是使用显式转换语法将 duration
转换为 time_point
。日期库对此类型有一个方便的类型别名: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});
}