エポックが既知のclock
タイプと同じであると仮定すると、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);
これは時計と同じ精度を使用していることから、そのクロックを含む任意の計算のために[OK]をする必要があり、それは、変換精度の一部を失う可能性があります。あなたがそれを失いたくなければ、そのdouble
ベースの継続時間タイプを使用するtime_point
専門化を使用しなければなりません。そして、あなたの計算でそれを使用します(もちろん、浮動小数点数学のすべての注意事項で)。
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()
));
}
};
あなたは[N2661]を超える読みました(http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2008/n2661.htm) – ildjarn
"(...)分数エポックタイムスタンプ、' double'で表されます。あなたはその時代を知っていますか? –
@ R.MartinhoFernandes:それは1970年1月1日以来の標準的なUNIXの時代です。 – mavam