微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – std :: string to std :: chrono time_point

我有一个以下时间格式的字符串:

“%Y-%m-%d%H:%M:%S.%f”

其中%f是毫秒,例如:14:31:23.946571

我希望这是一个计时时间点.有演员这样做吗?

解决方法

没有从std :: string转换为std :: chrono :: time_point.您必须构建std :: chrono :: time_point对象.

>使用除微秒之外的所有内容来构造std :: tm对象(< ctime>).
年份应该基于1900而不是0.月份应该基于0,而不是1.
>使用std :: mktime()创建std :: time_t对象.
>使用from_time_t()创建一个std :: chrono :: time_point.
>将剩余的小数部分(视为int)添加为time_point的std :: chrono :: microsecond()持续时间.

请注意< iomanip>函数std :: ctime()和std :: put_time()不知道精度低于一秒.如果要打印该精度级别,则需要编写一个函数来执行此操作.

#include <chrono>
#include <ctime>
#include <iomanip>
#include <iostream>

struct Tm : std::tm {
  int tm_usecs; // [0,999999] micros after the sec

  Tm(const int year,const int month,const int mday,const int hour,const int min,const int sec,const int usecs,const int isDST = -1)
      : tm_usecs{usecs} {
    tm_year = year - 1900; // [0,60] since 1900
    tm_mon = month - 1;    // [0,11] since Jan
    tm_mday = mday;        // [1,31]
    tm_hour = hour;        // [0,23] since midnight
    tm_min = min;          // [0,59] after the hour
    tm_sec = sec;          // [0,60] after the min
                           //         allows for 1 positive leap second
    tm_isdst = isDST;      // [-1...] -1 for unkNown,0 for not DST,//         any positive value if DST.
  }

  template <typename Clock_t = std::chrono::high_resolution_clock,typename MicroSecond_t = std::chrono::microseconds>
  auto to_time_point() -> typename Clock_t::time_point {
    auto time_c = mktime(this);
    return Clock_t::from_time_t(time_c) + MicroSecond_t{tm_usecs};
  }
};

int main() {
  using namespace std::chrono;

  auto tp_nomicro = Tm(2014,8,19,14,31,23,0).to_time_point();
  auto tp_micro = Tm(2014,946571).to_time_point();
  std::cout << duration_cast<microseconds>(tp_micro - tp_nomicro).count()
            << " microseconds apart.\n";

  auto time_c = high_resolution_clock::to_time_t(tp_micro);
  std::cout << std::ctime(&time_c) << '\n';
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐