2012-02-10 13 views
8

Uygun bir std::chrono::time_point'a dönüştürmek istediğim, double olarak gösterilen kesirli bir dönem zaman damgası var. Çatışma, 1/1/1970’ten beri her zamanki UNIX dönemidir. Var olduğunu biliyorum std::chrono::system_clock::from_time_t, ancak time_t kesirli bir parçası yok. C++ 11 ile bunu yapmanın en iyi yolu ne anlama gelir? o C++ 11 yerine bunun Boost sürümü için soran olması dışındaKesirli epoch zaman damgası (çift) bir std :: chrono :: time_point dosyasına nasıl dönüştürülür?

Bu soru, unix timestamp to boost::posix_time::ptime ilişkilidir.

+0

baştan okudunuz http://www.open-std.org/jtc1/sc22/ [N2661] wg21/docs/kağıtları/2008/n2661.htm)? – ildjarn

+0

"(...)" double "olarak gösterilen kesirli dönem zaman damgası" Hangi birimler? Çağı biliyor musun? –

+0

@ R.MartinhoFernandes: 1/1/1970'ten beri standart UNIX dönemidir. – mavam

cevap

12

Çağın, bilinen bir clock türüyle aynı olduğunu varsayarak, double gösterimi ile bir süreyi kullanabilir ve o saat tarafından kullanılan süreye dönüştürebilirsiniz. Eğer saati ile aynı hassasiyet kullandığınız beri

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

Bu, O saati içeren herhangi hesaplanması için ok olmalıdır, ancak bu dönüşümle kesinlik bazılarını kaybedebilirsiniz. Bunu kaybetmek istemiyorsanız, bu double tabanlı bir süre kullanan bir time_point uzmanlık kullanmanız gerekir. Ve sonra bunu hesaplamalarınızda kullanın (elbette, kayan nokta matematiğinin tüm uyarılarıyla). dönüşümleri gerektireceğinden

typedef std::chrono::time_point<clock, d_seconds> d_time_point; 

Ancak bu, aynı saati içeren herhangi hesaplamalar karmaşık hale getirecektir. Bunu kolaylaştırmak için, dönüşüm yapar kendi saat sarıcı inşa edebilirsiniz ve bu kullanın: (

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' ile nedir? – Puppy

+0

Cevabınız için teşekkürler. Hassasiyet kaybının nereden kaynaklandığını düşünür müsün? Ayrıca, 'd_time_point'de saat türü keyfi olabilir mi? – mavam

+0

@Matthias: Hassasiyet kaybı, saatin yerel süre türünün "double" olarak sahip olduğunuz tam süreyi gösteremeyebileceğinden dolayıdır. süresi 10.5 saniye, fakat saat süresi 1 saniye ile yekpare bir süre kullanıyorsa dönüştürüldüğünde Bir örnek olarak, bu 10s veya 11s olacaktır. İdeal olarak, d_time_point'deki saat tipi aynı çağa sahip olmalıdır. –

İlgili konular