【问题标题】:Convert a uint64_t to a time_point将 uint64_t 转换为 time_point
【发布时间】:2017-06-28 22:35:07
【问题描述】:

我有一个uint64_t 值,它表示自纪元以来的纳秒。现在我需要将其转换为time_point

目前我有这个代码:

std::chrono::time_point<std::chrono::nanoseconds> uptime(std::chrono::nanoseconds(deviceUptime));

稍后我想打印类似Fri Feb 10 15:13:04 2017 的内容。为此,我想使用以下代码:

std::time_t t = std::chrono::system_clock::to_time_t(uptime);
std::cout << "Device time: " << std::ctime(&t) << std::endl;

但我得到一个错误:

No viable conversion from 'time_point<std::chrono::nanoseconds>' to 'const time_point<std::__1::chrono::system_clock>'

如何将time_point 转换为ctime 可以使用的格式?或者有没有更好的方法来解决这个问题?

【问题讨论】:

  • 所以我需要将std::chrono::system_clock 添加到模板参数中,这给了我这个:std::chrono::time_point&lt;std::chrono::system_clock, std::chrono::nanoseconds&gt; uptime(std::chrono::nanoseconds(deviceUptime)); 但是我仍然得到同样的错误。

标签: c++ c++11 time chrono


【解决方案1】:

试试这个:

uint64_t uptime = 0;
using time_point = std::chrono::system_clock::time_point;
time_point uptime_timepoint{std::chrono::duration_cast<time_point::duration>(std::chrono::nanoseconds(uptime))};
std::time_t t = std::chrono::system_clock::to_time_t(uptime_timepoint);

或者:

std::time_t t = uptime / 1000000000;

【讨论】:

  • 谢谢你的作品。那么函数to_time_t 不接受纳秒?只是一个较低的精度值,例如毫秒?
  • @Pascal to_time_t 接受std::chrono::system_clock::time_point 的单位,无论分辨率如何。对于 GNU libstdc++,它是纳秒级分辨率,对于 clang libc++,它是微秒级分辨率。
  • ...这意味着您需要在某个地方使用 libc++ 进行强制转换,因为 nanoseconds 不能隐式转换为 microseconds。是duration_cast 还是time_point_cast 是个人喜好问题。
  • @MaximEgorushkin 啊好吧 :)
  • No it doesn't。这将是一个无声的截断,完全违背&lt;chrono&gt; 的设计。
【解决方案2】:

如果您决定不想在打印时丢失所有亚秒级信息,您可以使用Howard Hinnant's date library(MIT 许可证):

#include "date.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;
    uint64_t deviceUptime = 1486739584123456789;
    sys_time<nanoseconds> uptime{nanoseconds(deviceUptime)};
    std::cout << format("%a %b %e %T %Y\n", uptime);
}

这将输出类似:

Fri Feb 10 15:13:04.123456789 2017

date::sys_time&lt;nanoseconds&gt; 只是一个typedef 用于:

std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多