std::chrono::system_clock和C时间

std::chrono::system_clock and C time

我在我的项目中普遍使用以下时间点定义:

using time_point = std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long, std::ratio<1,1000>>>

根据这个定义,我在精度和范围之间进行了合理的权衡,不幸的是,默认的纳秒级分辨率给了我一个太短的范围。

不幸的是,我似乎无法使用 chrono::system_clock::from_time_t()chrono::system_clock::to_time_t 函数在 std::time_t 和非默认分辨率的时间点之间进行转换。有没有一种方法可以将 to_time_tfrom_time_t 函数与“我的”time_point class 一起使用?

如果您假设 std::chrono::system_clocktime_t 具有相同的纪元(通常如此),那么 to_time_tfrom_time_t 本质上只是一个 std::duration_cast .

例如,此代码应打印相同的值两次(请注意,未指定 to_time_t 轮次或截断,并且 duration_cast 始终截断,因此可能存在 1 秒的差异):

const auto now = std::chrono::system_clock::now();
time_t time = std::chrono::system_clock::to_time_t(now);
std::cout << time << "\n";
std::cout << std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()).count() << "\n";
std::cout << std::chrono::system_clock::from_time_t(time).time_since_epoch().count() << "\n";
std::cout << std::chrono::system_clock::time_point(std::chrono::seconds(time)).time_since_epoch().count() << "\n";

因此您可以相当轻松地编写自己的 to/from_time_t 函数:

constexpr time_point  my_point_from_time_t(time_t value)
{
    return time_point(std::chrono::seconds(value));
}

constexpr time_t my_point_to_time_t(const time_point & value)
{
    return std::chrono::duration_cast<std::chrono::seconds>(value.time_since_epoch()).count();
}

如果 system_clock 不使用与 time_t 相同的纪元,那么您可以简单地调整值:

const time_t system_clock_epoch = std::chrono::system_clock::to_time_t({});

time_point  my_point_from_time_t(time_t value)
{
    return time_point(std::chrono::seconds(value - system_clock_epoch));
}

time_t my_point_to_time_t(const time_point & value)
{
    return std::chrono::duration_cast<std::chrono::seconds>(value.time_since_epoch()).count() + system_clock_epoch;
}