如何打印 C 11 time_point?

新手上路,请多包涵

我已经创建了一个时间点,但我一直在努力将它打印到终端。

 #include <iostream>
#include <chrono>

int main(){

    //set time_point to current time
    std::chrono::time_point<std::chrono::system_clock,std::chrono::nanoseconds> time_point;
    time_point = std::chrono::system_clock::now();

    //print the time
    //...

    return 0;
}

我能找到的唯一打印 time_point 的文档在这里找到: http ://en.cppreference.com/w/cpp/chrono/time_point

但是,我什至无法根据我的 time_point(如示例)创建 time_t。

 std::time_t now_c = std::chrono::system_clock::to_time_t(time_point); //does not compile

错误:

 /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono: In instantiation of ‘constexpr std::chrono::time_point<_Clock, _Dur>::time_point(const std::chrono::time_point<_Clock, _Dur2>&) [with _Dur2 = std::chrono::duration<long int, std::ratio<1l, 1000000000l> >; _Clock = std::chrono::system_clock; _Dur = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]’:
time.cpp:13:69:   required from here
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:540:32: error: no matching function for call to ‘std::chrono::duration<long int, std::ratio<1l, 1000000l> >::duration(std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > >::duration)’
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:540:32: note: candidates are:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:247:14: note: template<class _Rep2, class _Period2, class> constexpr std::chrono::duration::duration(const std::chrono::duration<_Rep2, _Period2>&)
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:247:14: note:   template argument deduction/substitution failed:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:243:46: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:240:23: note: template<class _Rep2, class> constexpr std::chrono::duration::duration(const _Rep2&)
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:240:23: note:   template argument deduction/substitution failed:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:236:27: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:234:12: note: constexpr std::chrono::duration<_Rep, _Period>::duration(const std::chrono::duration<_Rep, _Period>&) [with _Rep = long int; _Period = std::ratio<1l, 1000000l>]
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:234:12: note:   no known conversion for argument 1 from ‘std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > >::duration {aka std::chrono::duration<long int, std::ratio<1l, 1000000000l> >}’ to ‘const std::chrono::duration<long int, std::ratio<1l, 1000000l> >&’
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:232:12: note: constexpr std::chrono::duration<_Rep, _Period>::duration() [with _Rep = long int; _Period = std::ratio<1l, 1000000l>]
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:232:12: note:   candidate expects 0 arguments, 1 provided

原文由 Trevor Hickey 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

(在这篇文章中,为了清楚起见,我将省略 std::chrono:: 限定条件。我相信你知道它们的去向。)

您的代码示例无法编译的原因是 system_clock::now() 的返回类型与您尝试将其分配给( time_point<system_clock, nanoseconds> )的变量类型不匹配。

记录的 system_clock::now() 的返回值是 system_clock::time_point ,这是 time_point<system_clock, system_clock::duration> 的类型定义。 system_clock::duration 是实现定义的,常用的是 microsecondsnanoseconds 。您的实现似乎使用 microseconds ,所以 --- 的返回类型是 system_clock::now() time_point<system_clock, microseconds>

time_point 具有不同持续时间的 s 不能相互隐式转换,因此会出现编译器错误。

您可以使用 time_point_cast 显式 转换具有不同持续时间的时间点,因此以下内容将在您的系统上编译:

 time_point<system_clock, nanoseconds> time_point;
time_point = time_point_cast<nanoseconds>(system_clock::now());

注意 time_point_cast 的显式模板参数是目标 持续时间 类型,而不是目标 time_point 类型。时钟类型必须在 time_point_cast 中匹配,因此指定整个 time_point 类型(在时钟类型和持续时间类型上都是模板)将是多余的。

当然,在您的情况下,由于您只是想打印时间点,因此不需要任何特定的分辨率,因此您可以声明 time_point 与什么类型相同 system_clock::now() 返回开头。一个简单的方法是使用 system_clock::time_point typedef:

 system_clock::time_point time_point;
time_point = system_clock::now();  // no time_point_cast needed

由于这是 C++11,您也可以只使用 auto

 auto time_point = system_clock::now();

解决了这个编译器错误后,转换为 time_t 就可以了:

 std::time_t now_c = std::chrono::system_clock::to_time_t(time_point);

您现在可以使用标准方法显示 time_t 值,例如 std::ctimestd::strftime 。 (正如 Cassio Neri 在对您的问题的评论中指出的那样,GCC 尚不支持更多的 C++-y std::put_time 函数)。

原文由 HighCommander4 发布,翻译遵循 CC BY-SA 3.0 许可协议

tl;博士如何打印原始 std::chrono::time_point

 #include <iostream>
#include <chrono>

int main()
{
  // begin is a std::chrono::time_point type
  // You can also use ::system_clock::now() to get the time since
  // Jan 1 1970 (differences between these linked below)
  auto begin = std::chrono::steady_clock::now();

  // print as nanoseconds. Can also choose ::microseconds, ::seconds, ::minutes,
  // ::hours. The type returned from .time_since_epoch() is
  // std::chrono::duration
  std::cout << "begin: " << std::chrono::duration_cast<std::chrono::nanoseconds>(begin.time_since_epoch()).count();

  return 0;
}


天哪,我认为 30 秒的谷歌搜索变成了兔子洞的研究项目。我想做的只是在我的程序中打印出一些原始时间点来直观地比较它们,对漂亮的打印不感兴趣。我确信这些其他答案也有效,但是它们有很多代码,使用 ctime struct s,第 3 方库等。我正在寻找一个最小的,“按原样打印这个值”解决方案,并没有直接找到太多。看来您不能简单地打印 ::time_point

 auto begin = std::chrono::steady_clock::now();
// BAD CODE, none of these work, in C++17 anyway
std::cout << begin;
std::cout << std::chrono::time_point_cast<std::chrono::nanoseconds>(begin);
std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(begin).count();
std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(begin - 0).count();

相反,您似乎只能打印一个 duration ,所以顶部说明的是一种创建持续时间的快速方法(来自 这里),从 now 直到纪元开始,这取决于您使用的时钟(基本上, ::system_clock 是挂钟时间,而 ::steady_clock 是从某个时间点开始的单调时钟,例如系统开机)。就我的目的而言, ::steady_clock 肯定是更好的选择,但只要我将苹果与苹果进行比较,这并不重要。我只是在寻找一些视觉反馈,而不是超级准确的东西。

我在这里创建了一个便签本 演示 如何打印我感兴趣的时间点,以及 ::steady_clock::system_clock 之间的一些差异。

原文由 yano 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题