2012-02-10 189 views
8

我有一个小数纪元时间戳,表示为double,我想将其转换为适当的std::chrono::time_point。这个时代是自1970年1月1日以来通常的UNIX时代。我知道存在std::chrono::system_clock::from_time_t,但time_t没有小数部分。用C++ 11做到这一点的最好方法是什么?如何将小数历元时间戳(double)转换为std :: chrono :: time_point?

此问题与unix timestamp to boost::posix_time::ptime有关,只是它要求C++ 11而不是Boost版本。

+0

你读过了[N2661](http://www.open-std.org/jtc1/sc22/ WG21 /文档/文件/ 2008/n2661.htm)? – ildjarn 2012-02-10 00:10:34

+0

“(...)分数时期时间戳,以”double“表示”什么单位?你知道这个时代吗? – 2012-02-10 00:11:40

+0

@ R.MartinhoFernandes:它是自1970年1月1日以来的标准UNIX时代。 – mavam 2012-02-10 00:16:08

回答

12

假设时期与已知的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() 
       )); 
    } 
}; 
+0

'324324.342'有什么含义? – Puppy 2012-02-10 00:33:55

+0

感谢您的回答。你介意阐述精度损失源于何处?另外,'d_time_point'中的时钟类型可以是任意的吗? – mavam 2012-02-10 00:42:02

+0

@Matthias:精度上的损失是因为时钟的本地持续时间类型可能无法表示您具有“double”的精确持续时间。例如,如果持续时间为10.5秒,但时钟使用周期为1秒的整数持续时间,则转换时将变为10秒或11秒。理想情况下,'d_time_point'中的时钟类型应该是具有相同历元的类型。 – 2012-02-10 00:44:52

相关问题