如何使用 std::chrono 库设置特定时间?

Posted

技术标签:

【中文标题】如何使用 std::chrono 库设置特定时间?【英文标题】:How do I set a specific time using the std::chrono library? 【发布时间】:2019-10-10 08:21:04 【问题描述】:

而不是使用std::chrono::system_clock::now();

我想设置自己的特定小时\分钟\秒。 类似于使用struct tm 手动构造日期时间。

最好的方法是什么?

【问题讨论】:

std::tm 实例不能直接转移到 <chrono> 类型系统。 tm 表示日历日期和时间,而 <chrono> 使用 std::chrono::time_point 实例化,它不知道天数并且依赖于 clock(模板参数)。也许您可以向我们提供更多关于您打算如何处理生成的对象的详细信息? 我收到 24 小时时间戳。我想将其转换为计时时间。我假设使用system_clock::now() 将引用纪元时间,同时也给我一个日期参考。基本上我想将 24 小时时间戳转换为纪元时间。 那么 24 小时时间戳是一个整数,表示从一天开始到一天结束的最大秒数? 是的,没错 【参考方案1】:

我找到了我正在寻找的解决方案。 看: A solution by Howard Hinnant

基本上你应该使用 24 小时的持续时间

using days = std::chrono::duration<int, std::ratio<86400>>;
auto last_midnight = std::chrono::time_point_cast<days>(std::chrono::system_clock::now());

然后添加 24 小时时间戳:)

【讨论】:

【参考方案2】:

&lt;chrono&gt; 提供的任何时钟指的是一个纪元,这与您的输入增量所指的时间点不同(基于问题下方的 cmets)。所以你不应该尝试使用std::chrono::time_point 实例(实例化时钟处理),而是使用std:chrono::duration。后者与任何参考时间点无关,您的输入也是如此。根据此输入的单位,选择预定义的std::duration 实例之一,例如

#include <chrono>

const int timestamp = getSecondsSinceMidnight();

const std::chrono::seconds sectimestamp;

现在你可以继续了,例如减去另一个时间戳等。

【讨论】:

【参考方案3】:

您可以使用 UDL(用户定义的文字)来创建持续时间。持续时间可以通过std::chrono::time_point的构造函数转换为时间点。

#include <iostream>
#include <chrono>

int main()

  using namespace std::literals::chrono_literals;

  auto nanoseconds_i = 3ns;
  auto nanoseconds_f = 3.1ns;

  std::cout << nanoseconds_i.count() << std::endl;
  std::cout << nanoseconds_f.count() << std::endl;

【讨论】:

以上是关于如何使用 std::chrono 库设置特定时间?的主要内容,如果未能解决你的问题,请参考以下文章

C++11 std::chrono库详解

std::chrono:将时钟的纪元设置为 1/1/0000

无法解析带有 NDK r10e 的 std::chrono

C++ 11 时间编程 std::chrono::steady_clock使用--计算程序执行时间

如何找到纪元时间戳和 std::chrono::system_clock::now 之间的时间差(以毫秒为单位)

使用chrono c++库计算时间戳的差异