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_t
和 from_time_t
函数与“我的”time_point class 一起使用?
如果您假设 std::chrono::system_clock
与 time_t
具有相同的纪元(通常如此),那么 to_time_t
和 from_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;
}
我在我的项目中普遍使用以下时间点定义:
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_t
和 from_time_t
函数与“我的”time_point class 一起使用?
如果您假设 std::chrono::system_clock
与 time_t
具有相同的纪元(通常如此),那么 to_time_t
和 from_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;
}