2009-10-15 11 views
12

Czy ktoś wie, czy istnieje dobry sposób, aby zmienić wartość boost::posix_time::ptime na wartość __int64. (Zrobiłem mikrosekundową wersję, a nie nanosekundową wersję).Sposób na zmianę boost :: posix_time :: ptime na __int64

muszę to zrobić jakoś tak szukam zapisać wynikowy __int64 w union typu, które wykorzystuje dane surowe dla aplikacji o wysokiej wydajności. Jakiś rodzaj funkcjonalności Memento, jak ten, byłby dla mnie bardzo przydatny. Chciałbym, o ile to możliwe, unikać rzutów, ale ucieknę się do nich, jeśli będę musiał.

+0

Tak, to co mam na myśli. W dokumentacji ciągle odnosimy się do każdej wartości całkowitej jako "długiej". Bardzo denerwujące, zwłaszcza, że ​​przykład pod warunkiem, że pokazuje, jak obliczyć sekundy od epoki używa metody, która zwraca długo –

Odpowiedz

15

Konwersja ptime na liczbę całkowitą jest raczej bez znaczenia, ponieważ ptime jest abstrakcją rzeczywistego czasu. Czas oparty na liczbie całkowitej jest reprezentacją tego czasu jako liczby z epoki. Co (prawdopodobnie) chcesz zrobić, to wygenerować time_duration z twojego czasu do interesującej Cię epoki, a następnie użyć time_duration :: ticks(), aby uzyskać 64-bitową liczbę całkowitą. Być może trzeba będzie przeskalować swój wynik do żądanej precyzji:

ptime myEpoch(date(1970,Jan,1)); // Or whatever your epocj is. 
time_duration myTimeFromEpoch = myTime - myEpoch; 
boost::int64_t myTimeAsInt = myTimeFromEpoch.ticks(); 
+0

Ahah ... Chyba przegapiłem, że mogę odjąć time_duration. Dzięki, to pomaga niezmiernie. –

0

Jest to łatwe do zrobienia przy użyciu klas chrono C++ 0x, które są oparte na uproszczonej wersji biblioteki czasu i daty Boost, ale patrząc na dokumenty doładowania, nie widzę niczego szczególnie oczywistego. W rzeczywistości jedyną metodą wykonania tego zadania jest wywołanie to_tm w celu przekonwertowania go do standardowego C struct tm, a następnie pomnożenie pól razem. To jest trochę nieprzyjemne, ale powinno działać (chociaż będziesz chciał zachować ostrożność w sekundach przestępnych i podobnych).

+1

Niestety, muszę również zachować rozdzielczość mikrosekundy, więc to nie zadziała. Widzę od czasu do czasu. Szkoda, że ​​nie ma czasu. To ułatwiłoby sprawę. –

0
#include <boost/date_time/posix_time/posix_time.hpp> 

// ... 

uint64_t secondsSinceEpoch(const boost::posix_time::ptime& time) { 
    namespace bpt = boost::posix_time; 
    const bpt::ptime epoch = bpt::from_time_t(0); 
    bpt::time_duration duration = time - epoch; 
    return duration.total_seconds(); 
} 

// ... 

namespace bpt = boost::posix_time; 
const bpt::ptime now = bpt::second_clock::local_time(); 
uint64_t seconds = secondsSinceEpoch(now); 
std::cout << "seconds: " << seconds << std::endl; 
Powiązane problemy