首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >std::chrono纪元是什么时候?

std::chrono纪元是什么时候?
EN

Stack Overflow用户
提问于 2015-04-22 21:35:53
回答 1查看 17.8K关注 0票数 32

std::chrono::time_point::time_since_epoch()返回一个duration,在过去引用了一些time_point。什么时候是这样的time_point?它取决于C++实现,还是由C++标准定义?还是将纪元设置为1970年1月1日协调世界时的事实标准?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-22 22:21:43

它既是time_point引用的特定clock的函数,也是该clock实现的函数。该标准规定了三种不同的时钟:

  • system_clock
  • steady_clock
  • high_resolution_clock

并且该标准没有为这些时钟中的任何一个指定历元。

程序员(你)也可以创作他们自己的时钟,它可以指定一个时期,也可以不指定一个时期。

有一个事实上的(非官方)标准,即std::chrono::system_clock::time_point有一个与Unix Time一致的时代。这被定义为自协调世界时(UTC) (1970年1月1日,星期四) 00:00:00以来所经过的持续时间,不包括闰秒。

Fwiw,here is a date/time library,它利用了这个事实上的标准。

对于另外两个std指定的时钟,没有事实上的标准。此外,允许high_resolution_clock作为system_clocksteady_clock的类型别名。

在OS上,high_resolution_clocksteady_clock的类型别名,而steady_clock是自计算机启动以来的纳秒计数(与协调时无关)。

更新

现在,system_clock的C++2a规范草案规定

sys_time<Duration>类型的

对象测量自1970-01-01 00:00:00UTC(不包括闰秒)起(及之前)的时间。此度量通常称为Unix时间。该措施促进了sys_time和日历类型(27.8)之间的有效映射。示例:sys_seconds{sys_days{1970y/January/1}}.time_since_epoch()0ssys_seconds{sys_days{2000y/January/1}}.time_since_epoch()946’684’800s,即10’957 * 86’400s。-end示例

此外,C++2a还引入了utc_clocktai_clockgps_clockfile_clock。这些时钟还具有明确定义的历元,因为可以在这些时钟和system_clock中从一个时钟clock_cast time_point到另一个时钟。

file_clock纪元将不可移植,但您仍然可以将其time_points与民用日历相关联。

utc_clocksystem_clock类似,不同之处在于它不会忽略闰秒。例如:

代码语言:javascript
复制
#include <chrono>
#include <iostream>

int
main()
{
    using namespace std::chrono;
    auto s1 = sys_days{December/31/2016} + 23h + 59min + 59s;
    auto s2 = sys_days{January/1/2017};
    auto u1 = clock_cast<utc_clock>(s1);
    auto u2 = clock_cast<utc_clock>(s2);
    std::cout << s2 - s1 << '\n';
    std::cout << u2 - u1 << '\n';
}

输出:

代码语言:javascript
复制
1s
2s

更新

链接到现在指定的(C++20) system_clock纪元:http://eel.is/c++draft/time.clock.system#overview-1

system_­clock类型的

对象表示系统范围的实时时钟的挂钟时间。sys_­time<Duration>类型的对象测量自1970-01-01 00:00:00UTC以来的时间,不包括闰秒。此度量通常称为Unix时间。此措施促进了sys_­time和日历类型(time.cal)之间的有效映射。示例:sys_­seconds{sys_­days{1970y/January/1}}.time_­since_­epoch()0ssys_­seconds{sys_­days{2000y/January/1}}.time_­since_­epoch()946'684'800s,即10'957 * 86'400s。-结束示例

票数 47
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29799293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档