Giả sử kỷ nguyên giống như loại clock
đã biết, bạn có thể sử dụng thời lượng với đại diện double
và chuyển đổi thành thời lượng được đồng hồ sử dụng.
// 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);
Điều này sẽ ổn cho bất kỳ phép tính nào liên quan đến đồng hồ đó, vì bạn sử dụng cùng độ chính xác như đồng hồ nhưng có thể mất một số độ chính xác trong chuyển đổi. Nếu bạn không muốn mất rằng bạn sẽ phải sử dụng chuyên môn time_point
sử dụng loại thời lượng dựa trên double
đó. Và sau đó sử dụng nó trong tính toán của bạn (tất nhiên, với tất cả các caveats của toán học dấu chấm động).
typedef std::chrono::time_point<clock, d_seconds> d_time_point;
Tuy nhiên, điều này sẽ làm phức tạp mọi tính toán liên quan đến cùng một đồng hồ, vì nó sẽ yêu cầu chuyển đổi. Để làm cho điều này dễ dàng hơn, bạn có thể tạo trình bao bọc đồng hồ của riêng mình thực hiện chuyển đổi và sử dụng:
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()
));
}
};
Nguồn
2012-02-10 00:31:47
Bạn đã đọc qua [N2661] (http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2008/n2661.htm)? – ildjarn
"(...) dấu thời gian epoch phân số, được biểu thị bằng' double' "Đơn vị nào? Bạn có biết thời đại? –
@ R.MartinhoFernandes: đó là kỷ nguyên UNIX chuẩn kể từ 1/1/1970. – mavam