2009-07-22 7 views
10

Ho bisogno di convertire il doppio con il numero di secondi dall'epoca a ptime. Sono sicuro che ci deve essere un modo semplice per farlo, ma non ho trovato nulla. Grazie.unix timestamp per aumentare :: posix_time :: ptime

Modifica: il timestamp originale è a virgola mobile. Non posso cambiarlo e non voglio perdere la precisione al secondo.

+0

Sei sicuro di aver bisogno di un doppio? Penso che si adatti a un int. – slipbull

+1

Sì, ho bisogno di doppio - è una parte di un'interfaccia che non posso cambiare. Se è un numero di secondi, non è possibile acquisire la parte frazionale ... e http://xkcd.com/607/ :-) – cube

risposta

5

dopo un po 'armeggiare intorno sono arrivato fino a questo:

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

Non sono sicuro che questa è la soluzione migliore, ma sembra di fare quello che mi serve.

8

Utilizzare la funzione di conversione from_time_t(). A time_t è un timestamp UNIX, ovvero il numero di secondi dall'epoca.

+1

time_t non può contenere parti frazionarie di secondi, ma grazie per la risposta – cube

+0

' time_t' è un timestamp UNIX su quasi tutte le piattaforme, ma lo standard C++ non specifica questo comportamento. Quindi stai attento con questa traduzione. –

7

Per una macchina che ha la data spinta/ora compilato al livello predefinito di risoluzione microsecondo, provate questo:

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; 

L'uscita di questo è "timbro tempo è 2009-ago-17 16:00: 00.500000 "sulla mia macchina Linux.

+2

Probabilmente vorrete aggiungere un '+ 0.5' al vostro calcolo' microsecondsSinceSecond' per ottenere round to to nearest. Altrimenti soffrirai di bug di troncamento. Però ... Immagino che chiunque si preoccupi della differenza di mezzo microsecondo probabilmente non memorizzerebbe un timestamp in un "double" in primo luogo. – Tom

+0

@ Tom: sei corretto qui, anche se mi aspetto che chiunque abbia veramente a cuore questo livello di risoluzione configurerà la loro distribuzione di boost per il supporto al nanosecondo e apporta le opportune modifiche al codice sopra. –

+0

+1 Grande frammento di codice che conta per secondi frazionari. –