簡體   English   中英

如何將分數紀元時間戳(double)轉換為std :: chrono :: time_point?

[英]How to convert a fractional epoch timestamp (double) to an std::chrono::time_point?

我有一個小數紀元時間戳,表示為double ,我想將其轉換為適當的std::chrono::time_point 這個時代是自1970年1月1日以來的常見UNIX時代。 我知道存在std::chrono::system_clock::from_time_t ,但是time_t沒有小數部分。 使用C ++ 11的最佳方法是什么?

這個問題與boost :: posix_time :: ptime的unix時間戳有關,除了它要求的是C ++ 11而不是Boost版本。

假設紀元與已知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);

這適用於任何涉及該時鍾的計算,因為您使用與時鍾相同的精度,但它可能會失去轉換中的某些精度。 如果您不想丟失,則必須使用使用該基於double time_point持續時間類型的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()
               ));
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM