【问题标题】:Convert std::chrono::milliseconds to ISO 8601 string将 std::chrono::milliseconds 转换为 ISO 8601 字符串
【发布时间】:2021-06-19 12:32:03
【问题描述】:

我有一个 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,但没有任何结果(它返回一个空字符串)。

【问题讨论】:

    标签: c++ date chrono iso8601


    【解决方案1】:

    问题是您将时间duration (milliseconds) 视为time_point (time_point&lt;system_clock, milliseconds&gt;)。您需要做的就是使用显式转换语法将duration 转换为time_pointdate lib 具有此类型的便利类型别名:sys_time&lt;milliseconds&gt;

    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});
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      相关资源
      最近更新 更多