2011-02-05 18 views

risposta

13

ho trovato questo sulla spinta impegna Mailing List: http://lists.boost.org/boost-commit/2009/04/15209.php

Qui sono le funzioni rilevanti:

template < class Clock, class Duration> 
struct convert_to<posix_time::ptime, chrono::time_point<Clock, Duration> > { 
    inline static posix_time::ptime apply(const chrono::time_point<Clock, Duration>& from) 
    { 
     typedef chrono::time_point<Clock, Duration> time_point_t; 
     typedef chrono::nanoseconds duration_t; 
     typedef duration_t::rep rep_t; 
     rep_t d = chrono::duration_cast<duration_t>(from.time_since_epoch()).count(); 
     rep_t sec = d/1000000000; 
     rep_t nsec = d%1000000000; 
     return boost::posix_time::from_time_t(0)+ 
     boost::posix_time::seconds(static_cast<long>(sec))+ 
     #ifdef BOOST_DATE_TIME_HAS_NANOSECONDS 
     boost::posix_time::nanoseconds(nsec); 
     #else 
     boost::posix_time::microseconds((nsec+500)/1000); 
     #endif 
    } 
}; 

template < class Clock, class Duration> 
struct convert_to<chrono::time_point<Clock, Duration>, posix_time::ptime> { 
    inline static chrono::time_point<Clock, Duration> apply(const posix_time::ptime& from) 
    { 
     boost::posix_time::time_duration const time_since_epoch=from-boost::posix_time::from_time_t(0); 
     chrono::time_point<Clock, Duration> t=chrono::system_clock::from_time_t(time_since_epoch.total_seconds()); 
     long nsec=time_since_epoch.fractional_seconds()*(1000000000/time_since_epoch.ticks_per_second()); 
     return t+chrono::nanoseconds(nsec); 

    } 
}; 

Non sono sicuro di quando hanno intenzione di entrare a far parte di un rilascio spinta. Non sembrano essere nel bagagliaio boost adesso ...

+9

Buona ricerca. Sembra che queste funzioni presumano che l'epoca di Clock sia la stessa di ptime: New Years, 1970. Se questa ipotesi è vera, queste funzioni funzionano. In caso contrario, queste funzioni sono un errore di runtime silenzioso. –

+0

È possibile implementare correttamente queste funzioni anche se le epoche sono diverse? – HighCommander4

+4

Credo che tu possa avvicinarti molto. Vorrei prima creare un chrono :: clock personalizzato (non ha bisogno di essere chrono del namespace) che ha un'epoca di New Years, 1970. Converti tra ptime e il tuo nuovo Clock come descritto sopra. E poi puoi approssimativamente convertire tra i tuoi due orologi cronologici ottenendo l'ora() da ognuno di essi (uno subito dopo l'altro). Sottrai il time_since_epoch() di ogni time_point per ottenere una durata che è la differenza tra le epoche dei tuoi due orologi cronografici. Aggiungi/sottrai quella differenza per convertire tra i due crono time_points. –

11

È possibile convertire un time_t da e verso uno std :: crono :: :: system_clock time_point:

class system_clock 
{ 
public: 
    ... 
    static time_t  to_time_t (const time_point& __t); 
    static time_point from_time_t(time_t __t); 
}; 

E si può convertire un time_t a un ptime:

ptime from_time_t(time_t t); 

Comunque io non vedo un modo per convertire un ptime in un time_t.

+1

puoi usare boost to_tm (ptime) per ottenere la struttura tm e quindi usare mktime (...) da time.h/ctime per ottenere time_t. vedi http://www.cplusplus.com/reference/ctime/mktime/ –

+1

Assicurati che il tuo software non venga eseguito dopo l'anno 2038 https://en.wikipedia.org/wiki/Year_2038_problem –

+0

Espandi sul commento di @DarienPardinas Le piattaforme Linux a 32 bit usano un intero con segno a 32 bit per 'time_t'. Ciò porterà a un problema Y2038. –

Problemi correlati