gpt4 book ai didi

c++ - 如何将分数纪元时间戳( double )转换为 std::chrono::time_point?

转载 作者:可可西里 更新时间:2023-11-01 17:35:43 24 4
gpt4 key购买 nike

我有一个小数纪元时间戳,表示为 double,我想将其转换为适当的 std::chrono::time_point。纪元是自 1/1/1970 以来的常用 UNIX 纪元。我知道存在 std::chrono::system_clock::from_time_t,但是 time_t 没有小数部分。使用 C++11 方法执行此操作的最佳方法是什么?

这个问题与unix timestamp to boost::posix_time::ptime有关, 除了它要求的是 C++11 而不是它的 Boost 版本。

最佳答案

假设纪元与已知的时钟类型相同,您可以使用具有double表示的持续时间并转换为该时钟使用的持续时间。

// change period to appropriate units - I'm assuming seconds
typedef std::chrono::duration<double, std::ratio<1>> d_seconds;

d_seconds since_epoch_full(324324.342);
auto since_epoch = std::chrono::duration_cast<clock::duration>(since_epoch_full);
clock::time_point point(since_epoch);

这对于涉及该时钟的任何计算都应该没问题,因为您使用的精度与时钟相同,但它可能会在转换中损失一些精度。如果您不想失去它,则必须使用 time_point 特化,它使用基于 double 的持续时间类型。然后在您的计算中使用它(当然,还有 float 学的所有注意事项)。

typedef std::chrono::time_point<clock, d_seconds> d_time_point;

但是,这会使涉及同一时钟的任何计算变得复杂,因为它需要转换。为了使这更容易,您可以构建自己的时钟包装器来进行转换并使用它:

template <typename Clock>
struct my_clock_with_doubles {
typedef double rep;
typedef std::ratio<1> period;
typedef std::chrono::duration<rep, period> duration;
typedef std::chrono::time_point<my_clock_with_doubles<Clock>> time_point;
static const bool is_steady = Clock::is_steady;

static time_point now() noexcept {
return time_point(std::chrono::duration_cast<duration>(
Clock::now().time_since_epoch()
));
}

static time_t to_time_t(const time_point& t) noexcept {
return Clock::to_time_t(typename Clock::time_point(
std::chrono::duration_cast<typename Clock::duration>(
t.time_since_epoch()
)
));
}
static time_point from_time_t(time_t t) noexcept {
return time_point(std::chrono::duration_cast<duration>(
Clock::from_time_t(t).time_since_epoch()
));
}
};

关于c++ - 如何将分数纪元时间戳( double )转换为 std::chrono::time_point?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9220855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com