2009-07-22 23 views
10

Necesito convertir el doble con el número de segundos desde la época en ptime. Estoy seguro de que debe haber una manera fácil de hacerlo, pero no pude encontrar nada. Gracias.marca de tiempo unix para aumentar :: posix_time :: ptime

Editar: La marca de tiempo original es punto flotante. No puedo cambiarlo y no quiero perder la precisión de los segundos.

+0

¿Seguro que necesita un doble? Creo que encaja en un int. – slipbull

+1

Sí, necesito el doble: es parte de una interfaz que no puedo cambiar. Si es un número de segundos, entonces no puede capturar la parte fraccionaria ... y http://xkcd.com/607/ :-) – cube

Respuesta

5

después de algún volverse locos me ocurrió esto:

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

No estoy seguro de que esta es la mejor solución, pero parece que hacer lo que necesito.

8

Utilice la función de conversión from_time_t(). A time_t es una marca de tiempo de UNIX, es decir, la cantidad de segundos desde la época.

+1

time_t no puede contener fracciones de segundos, pero gracias por la respuesta – cube

+0

' time_t' es la marca de tiempo UNIX en casi cualquier plataforma, pero el estándar C++ no especifica este comportamiento. Así que ten cuidado con esta traducción. –

7

Para una máquina que tiene fecha de impulso/hora compilado en el nivel predeterminado de la resolución de microsegundos, intente esto:

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; 

La salida para esto es "sello de tiempo es 2009-Ago-17 16:00: 00.500000 "en mi linux box.

+2

Probablemente desee agregar un '+ 0.5' a su cálculo' microsegundosSinceSegundo' para obtener el redondeo al más cercano. De lo contrario, sufrirá errores de truncamiento. Aunque ... supongo que cualquiera que se preocupe por la diferencia de la mitad de un microsegundo probablemente no almacenaría una marca de tiempo en un "doble" en primer lugar. – Tom

+0

@Tom: Tiene razón aquí, aunque espero que cualquiera que realmente se preocupe por este nivel de resolución configure su distribución de Boost para soporte de nanosegundos y realice los cambios apropiados en el código anterior. –

+0

+1 Gran fragmento de código que representa los segundos fraccionarios. –

Cuestiones relacionadas