标准::时间纪元是什么时候?
When is std::chrono epoch?
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_clock
是system_clock
或steady_clock
的类型别名。
在OS X上,high_resolution_clock
是steady_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_clock
、tai_clock
、gps_clock
和file_clock
。 这些时钟也有明确定义的时代,因为人们可以在这些时钟和system_clock
中从一个时钟clock_cast
time_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
。— 结束示例]
- 什么时候调用组成单元对象的析构函数
- 什么时候在C++中返回常量引用是个好主意
- 什么时候调用析构函数
- boost odeint什么时候真正调用观测者
- 编译器对数组声明大小的计算。什么时候发生?
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 您应该在什么时候创建自己的异常类型
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 什么时候可以使用常量装饰调用我的重载函数?
- unordered_map什么时候返回 -1?
- QCoreApplication什么时候有效?
- sizeof(size_t) 和 sizeof(ptrdiff_t) 什么时候会有所不同?
- 什么时候用指针调用C++类构造函数
- 我不明白在这个例子中什么时候调用构造函数
- 如果真的需要std::move,我们应该什么时候声明右值refs
- P1008("prohibit aggregates with user-declared constructors")在实践中什么时候有用?
- 程序什么时候会创建多个堆
- 调用boost.asio的异步函数时,线程是什么时候创建的
- Swig/python : 什么时候需要 SWIG_init() ?
- 标准::时间纪元是什么时候?