Предполагая, что эпоха такая же, как у известного типа 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);
Это должно быть хорошо для любых расчетов с участием, что часы, так как вы используете ту же точность, как часы, но он может потерять некоторые точности преобразования. Если вы не хотите потерять это, вам придется использовать специализацию time_point
, которая использует этот тип времени, который используется на основе double
. А затем используйте это в своих расчетах (конечно, со всеми оговорками математики с плавающей запятой).
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/документы/документы/2008/n2661.htm)? – ildjarn
"(...) дробная временная метка эпохи, представленная как« двойная ». Какие единицы? Вы знаете эпоху? –
@ R.MartinhoFernandes: это стандартная эпоха UNIX с 01.01.1970. – mavam