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

问题描述

我有一个 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});
}