2009-07-22 22 views
10

Potrzebuję konwertować podwójne z liczbą sekund od epoki do ptime. Jestem pewien, że musi to być łatwy sposób, ale nie mogłem nic znaleźć. Dzięki.Uniksowy znacznik czasu do zwiększenia :: posix_time :: ptime

Edytuj: Oryginalny znacznik czasu jest zmiennoprzecinkowy. Nie mogę tego zmienić i nie chcę stracić dokładności pod sekundę.

+0

Jesteś pewien, że potrzebujesz podwójnego? Myślę, że pasuje do int. – slipbull

+1

Tak, potrzebuję podwójnego - jest to część interfejsu, którego nie mogę zmienić. Jeśli jest to liczba sekund, to nie możesz uchwycić części ułamkowej ... i http://xkcd.com/607/ :-) – cube

Odpowiedz

5

po jakiś błahy wokół wymyśliłem to:

ptime(date(1970, 1, 1), time_duration(0, 0, 0, time_duration::ticks_per_second() * 1234567890.0987654321)) 

nie jestem pewien, że to jest najlepsze rozwiązanie, ale wydaje się, aby robić to, co muszę.

8

Użyj funkcji konwersji from_time_t(). A time_t to znacznik czasu UNIX, tj. Liczba sekund od epoki.

+1

time_t nie może zawierać ułamkowych części sekund, ale dzięki za odpowiedź – cube

+0

' time_t' to UNIX timestamp na prawie każdej platformie, ale standard C++ nie określa tego zachowania. Uważaj więc na to tłumaczenie. –

7

Na komputerze, który ma datę/czas doładowania skompilowany z domyślnym poziomie mikrosekund, spróbuj tego:

double ts = 1250524800.5; 
// Use floor() here if seconds are always positive. 
time_t secondsSinceEpoch = floor(ts); 
long microsecondsSinceSecond = 
    floor((ts - static_cast<double>(secondsSinceEpoch)) * 1000000); 
boost::posix_time::ptime result = 
    boost::posix_time::from_time_t(secondsSinceEpoch); 
boost::posix_time::time_duration fractionalSeconds(0, 0, 0, 
                microsecondsSinceSecond); 
result += fractionalSeconds; 
cout << "Time stamp is " << result << endl; 

Wyjście tego jest „stemplem czasowym jest 2009-Aug-17 16:00: 00.500000 "na moim komputerze linuxowym.

+2

Prawdopodobnie chcesz dodać '+ 0.5' do obliczeń' mikrosekundySinceSecond', aby uzyskać zaokrąglenie do najbliższego. W przeciwnym razie wystąpią błędy skracania. Chociaż ... Sądzę, że każdy, kto troszczy się o różnicę połowy mikrosekundy, prawdopodobnie nie zapisałby znacznika czasu w "podwójnym" w pierwszej kolejności. – Tom

+0

@Tom: Masz rację, chociaż spodziewam się, że każdy, kto naprawdę dba o ten poziom rozdzielczości, skonfiguruje swoją dystrybucję Boost na wsparcie nanosekund i dokona odpowiednich zmian w powyższym kodzie. –

+0

+1 Świetne ujęcie kodu ułamkowe sekund. –