2012-02-10 14 views
8

doubleと表される分数エポックタイムスタンプがありますが、これは適切なstd::chrono::time_pointに変換したいものです。この時代は、1970年1月1日以来の通常のUNIX時代です。私はstd::chrono::system_clock::from_time_tが存在することを知っていますが、time_tには小数部がありません。 C++ 11でこれを行う最善の方法は何でしょうか?分数エポックタイムスタンプ(ダブル)をstd :: chrono :: time_pointに変換するには?

この質問は、unix timestamp to boost::posix_time::ptimeに関連していますが、BoostバージョンではなくC++ 11を要求しています。

+0

あなたは[N2661]を超える読みました(http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2008/n2661.htm) – ildjarn

+0

"(...)分数エポックタイムスタンプ、' double'で表されます。あなたはその時代を知っていますか? –

+0

@ R.MartinhoFernandes:それは1970年1月1日以来の標準的なUNIXの時代です。 – mavam

答えて

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); 

これは時計と同じ精度を使用していることから、そのクロックを含む任意の計算のために[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() 
       )); 
    } 
}; 
+0

「324324.342」とは何ですか? – Puppy

+0

答えをありがとう。精度の低下がどこで発生したのか精巧に考えてください。また、 'd_time_point'のクロックタイプは任意ですか? – mavam

+0

@Matthias:精度の低下は、クロックのネイティブ・デュレーション・タイプが、あなたが「ダブル」として持っている正確な持続時間を表すことができないことがあるためです。一例として、持続時間が10.5秒であるが、クロックが1秒間の積分時間を使用する場合、変換時に10秒または11秒になります。理想的には、 'd_time_point'のクロックタイプは、同じエポックを持つものでなければなりません。 –

関連する問題