标准::时间纪元是什么时候?

When is std::chrono epoch?

本文关键字:什么时候 纪元 时间 标准      更新时间:2023-10-16

std::chrono::time_point::time_since_epoch()返回一个duration,指的是过去的一些time_point。什么时候有这样的time_point?这取决于C++实现还是由C++标准定义?或者将纪元设置为 1970 年 1 月 1 日 UTC 是事实上的标准?

它是time_point所指的特定clock以及该clock的实现的函数。 该标准规定了三种不同的时钟:

  • system_clock
  • steady_clock
  • high_resolution_clock

而且该标准没有指定任何这些时钟的纪元。

程序员(您)还可以编写自己的时钟,这些时钟可能会也可能不会指定纪元。

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

Fwiw,这是一个利用这个事实标准的日期/时间库。

其他两个标准指定的时钟没有事实上的标准。 此外,允许high_resolution_clocksystem_clocksteady_clock的类型别名。

在OS X上,high_resolution_clocksteady_clock的类型别名,steady_clock是自计算机启动以来的纳秒计数(与UTC没有任何关系)。

更新

草案 C++2a 规范现在说system_clock

类型sys_time<Duration>的对象测量自(和之前)以来的时间 1970-01-01 00:00:00 UTC 不包括闰秒。这项措施是 通常称为 Unix 时间。这项措施有助于sys_time和日历类型之间的高效映射 (27.8)。 [示例sys_seconds{sys_days{1970y/January/1}}.time_since_epoch()0s.sys_seconds{sys_days{2000y/January/1}}.time_since_epoch()946’684’800s,这是10’957 * 86’400s。—结束示例]

此外,C++2a引入了utc_clocktai_clockgps_clockfile_clock。 这些时钟也有明确定义的时代,因为人们可以在这些时钟和system_clock中从一个时钟clock_casttime_point到另一个时钟。

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

utc_clock就像system_clock,只是它不忽略闰秒。 例如:

#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';
}

输出:

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:00 UTC 以来测量时间,不包括闰秒。 此度量通常称为Unix 时间。这项措施 促进sys_­time和日历之间的高效映射 类型 ([time.cal])。[示例:sys_­seconds{sys_­days{1970y/January/1}}.time_­since_­epoch()0s.sys_­seconds{sys_­days{2000y/January/1}}.time_­since_­epoch()946'684'800s,这是10'957 * 86'400s— 结束示例]