纳秒分辨率到纳秒纪元的日历时间
Calendar time with nanoseconds resolution to nanoseconds epoch
我正在使用一个 属性 c++11
库,它有自己的实现 Datetime
它们的实现可以简化为一个结构,其中包含最多纳秒的时间部分.
一个粗略的例子如下:
struct custom_time_t {
unsigned year;
unsigned month;
unsigned day;
unsigned hour;
.......
long long nanoseconds;
}
我想从这个自定义对象中获取 epoch
,但也是纳秒分辨率 - 类似于 gettimeofday
。
通常使用 std::chrono
和 std::tm
将纪元提高到秒,但是自 epoch
以来如何获得纳秒?
我会坚持 std::chrono
并将 duration 转换为 std::chrono::nanoseconds
。
#include <iostream>
#include <chrono>
int main() {
const auto p0 = std::chrono::time_point<std::chrono::system_clock>{};
const auto end = std::chrono::system_clock::now();
const auto diff = end - p0;
const auto diff_ns = std::chrono::duration_cast< std::chrono::nanoseconds >( diff );
const auto diff_h = std::chrono::duration_cast< std::chrono::hours >( diff );
std::cout << diff_h.count() << "h " << diff.count() << " s " << diff_ns.count() << "ns\n";
}
Ps。我真的不明白自己存储年、月、……的值有什么意义。
最简单的方法是使用这个preview of the C++20 <chrono>
library。
#include "date/date.h"
#include <chrono>
std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>
to_time_point(custom_time_t const& t)
{
using namespace date;
using namespace std::chrono;
return sys_days{year(t.year)/t.month/t.day} + hours(t.hour) + ...
+ nanoseconds{t.nanoseconds};
}
return 类型对于基于 system_clock
的 time_point
具有正确的值。如果您使用 .time_since_epoch().count()
从中提取值,您将获得自 1970-01-01 00:00:00.000000000 UTC.
以来(或之前)的 nanoseconds
的数量
也可以使用 auto
作为 C++14 中的 return 类型,但我想弄清楚 return 类型是什么。此 return 类型还有一个类型别名:sys_time<nanoseconds>
.
我正在使用一个 属性 c++11
库,它有自己的实现 Datetime
它们的实现可以简化为一个结构,其中包含最多纳秒的时间部分.
一个粗略的例子如下:
struct custom_time_t {
unsigned year;
unsigned month;
unsigned day;
unsigned hour;
.......
long long nanoseconds;
}
我想从这个自定义对象中获取 epoch
,但也是纳秒分辨率 - 类似于 gettimeofday
。
通常使用 std::chrono
和 std::tm
将纪元提高到秒,但是自 epoch
以来如何获得纳秒?
我会坚持 std::chrono
并将 duration 转换为 std::chrono::nanoseconds
。
#include <iostream>
#include <chrono>
int main() {
const auto p0 = std::chrono::time_point<std::chrono::system_clock>{};
const auto end = std::chrono::system_clock::now();
const auto diff = end - p0;
const auto diff_ns = std::chrono::duration_cast< std::chrono::nanoseconds >( diff );
const auto diff_h = std::chrono::duration_cast< std::chrono::hours >( diff );
std::cout << diff_h.count() << "h " << diff.count() << " s " << diff_ns.count() << "ns\n";
}
Ps。我真的不明白自己存储年、月、……的值有什么意义。
最简单的方法是使用这个preview of the C++20 <chrono>
library。
#include "date/date.h"
#include <chrono>
std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>
to_time_point(custom_time_t const& t)
{
using namespace date;
using namespace std::chrono;
return sys_days{year(t.year)/t.month/t.day} + hours(t.hour) + ...
+ nanoseconds{t.nanoseconds};
}
return 类型对于基于 system_clock
的 time_point
具有正确的值。如果您使用 .time_since_epoch().count()
从中提取值,您将获得自 1970-01-01 00:00:00.000000000 UTC.
nanoseconds
的数量
也可以使用 auto
作为 C++14 中的 return 类型,但我想弄清楚 return 类型是什么。此 return 类型还有一个类型别名:sys_time<nanoseconds>
.