将std::chrono::milliseconds转换成ISO 8601字符串。

3

我有一个代表毫秒级别的Unix纪元时间的std::chrono::milliseconds。我需要将其转换为符合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,但没有任何结果(它返回给我一个空字符串)。

1个回答

4
问题在于您将时间“持续时间”(毫秒)视为“时间点”(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});
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接