【问题标题】:Chrono duration to time string时间字符串的计时持续时间
【发布时间】:2020-01-10 18:06:06
【问题描述】:

我有几行代码可以获取我的 Windows 机器上的系统时钟并将其转换为双精度。

std::chrono::time_point<std::chrono::system_clock> currentNow = 
std::chrono::system_clock::now();
auto duration = currentNow.time_since_epoch();
double millis = static_cast<double>(std::chrono::duration_cast<std::chrono::milliseconds>(duration).count());
double origin_time = millis / 1000;

我想稍后将其反转并将双精度转换为格式为 YYYY-mm-dd HH:MM:SS.ffffffff

的字符串

我现在要做的第一步是获取双精度并将其作为参数传递给 chrono::duration。

auto rep = std::chrono::duration<double>(origin_time);

我将如何使用 chrono 库来实现上面指定的字符串,谢谢!

【问题讨论】:

  • chrono 几乎完全与计时有关。要将chrono 时间格式化为字符串,你注定要放弃chrono 并使用旧的C 时间格式化例程或编写类似于date 的东西。这在 C++20 中得到解决,几乎是通过将 date 同化到集体中来解决的。
  • date.h chrono 解决方案。它也是与 C++11/14/17 一起使用的(当前草稿)C++20 &lt;chrono&gt; 的预览。 C++11 &lt;chrono&gt; 没有任何内置的格式化功能。在 C++20 中,它只是 cout &lt;&lt; system_clock::now()
  • 很难在没有看到您的代码的情况下判断。但我的第一个猜测是您将double 转换为days 而不是seconds。您是否必须首先转换为double?如果不转义&lt;chrono&gt; 类型系统,就不会发生这种错误。
  • 太棒了!现在您知道如何使用 date.h 了! :-) 你也可以用system_clock::time_point{} 替换sys_days{January/1/1970}。唯一的区别是可读性,选择你最喜欢的。它们都表示“系统时钟时代”。它们都是编译时常量。

标签: c++11 chrono


【解决方案1】:

构造一个包含当前纪元的新time_point

auto epoch = std::chrono::time_point<std::chrono::system_clock>();

将转换后的持续时间添加到此time_point

auto oldNow = epoch + std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::duration<double>(origin_time));

将其转换为std::time_t

auto t_c = std::chrono::system_clock::to_time_t(oldNow);

使用time_t 的格式化工具打印它:

std::cout << std::put_time(std::localtime(&t_c), "%F %T");

示例输出:

2020-01-10 18:45:48

See it live!

您会注意到它缺少 .ffffffff 部分。那是因为std::put_time 没有格式化选项。如果这对您很重要,您可以自己轻松计算值并将其放在字符串的末尾。

还请注意,使用 C++20 chrono 或 Howard 的 Date 库(基本上是相同的,除了这里和那里的一些位),这会更好地完成,正如该人自己在 cmets 中所指出的那样。有关它的概述,您可能对this answer感兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2011-07-30
    相关资源
    最近更新 更多