1

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

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()and函数在非默认分辨率的时间点chrono::system_clock::to_time_t之间进行转换。std::time_t有没有办法可以将to_time_tandfrom_time_t函数与“我的” time_point 类一起使用?

4

1 回答 1

1

如果您假设它与(通常会)std::chrono::system_clock具有相同的时代,那么并且本质上只是一个.time_tto_time_tfrom_time_tstd::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_tthen 相同的时期,您可以简单地调整值:

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;
}
于 2021-02-24T08:36:51.147 回答