我正在使用一个属性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
年以来的纳秒?
最简单的方法是使用 C++20 <chrono>
库的预览。
#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};
}
返回类型具有基于 system_clock
的time_point
的正确值。 如果使用 .time_since_epoch().count()
从中提取值,您将获得自 1970-01-01 00:00:00.000000000 UTC 以来(或之前(的nanoseconds
数。
在 C++14 中也可以使用 auto
作为返回类型,但我想弄清楚返回类型是什么。 此返回类型还有一个类型别名:sys_time<nanoseconds>
。
我会坚持std::chrono
并将持续时间转换为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() << "nsn";
}
附言。我真的看不出存储年、月、...靠你自己。