2012-02-10 103 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

相關問題