¿Hay alguna forma "estándar" o lo mejor que puedo hacer es calcularla directamente restando de gregorian::date(1970,1,1)
?¿Cómo convierto boost :: posix_time :: ptime a time_t?
Respuesta
time_t
es el tipo utilizado para mantener el tiempo en segundos (por lo general, el tiempo de época). Supongo que estás después del tiempo de la época, si es así, no estoy al tanto de ninguna forma de aumentar el tiempo de época directamente, aparte de la resta que ya tienes. Una vez que tenga un time_duration
(resultado de la resta), puede llamar al total_seconds()
en la duración y almacenarlo en time_t
.
btw. si buscas tiempo de época, puedes usar gettimeofday()
y ahorrarte un dolor de cabeza.
Dado que el método de @hielocrime se convierte dos veces (ptime usa la representación lineal internamente), he decidido usar el cálculo directo en su lugar. Aquí está:
time_t to_time_t(boost::posix_time::ptime t)
{
using namespace boost::posix_time;
ptime epoch(boost::gregorian::date(1970,1,1));
time_duration::sec_type x = (t - epoch).total_seconds();
// ... check overflow here ...
return time_t(x);
}
EDIT: Gracias @jaaw por traer esto a mi atención. Desde el impulso 1.58, esta función se incluye en date_time/posix_time/conversion.hpp
, std::time_t to_time_t(ptime pt)
.
¡Qué pena que no lo hayan agregado como una función directa en la biblioteca ... Me pregunto cuáles son las razones fueron ... – Nim
podrían hacer que ptime epoch sea estático versus computar cada llamada. –
use std :: time_t posix_time :: to_time_t (posix_time :: ptime pt) en conversion.hpp – jaaw
Aquí hay una variación del método de @ ybungalobill que lo hará pasar 2038, por las dudas. :)
int64_t rax::ToPosix64(const boost::posix_time::ptime& pt)
{
using namespace boost::posix_time;
static ptime epoch(boost::gregorian::date(1970, 1, 1));
time_duration diff(pt - epoch);
return (diff.ticks()/diff.ticks_per_second());
}
time_t ya tiene 64 bits en muchos sistemas. – ybungalobill
Sí, pero cuando está escribiendo una aplicación multiplataforma, también debe admitir 32 bits. – kgriffs
@ybungalobill: El problema no es tanto 'time_t' sino' time_duration :: sec_type' que es de 32 bits (al menos en mi máquina). –
Estas 2 líneas deberían hacerlo.
tm td_tm = to_tm(pt);
time_t tt = mktime(&td_tm);
Lo que hay que tener cuidado con esto y la solución de icecrime anterior es el contrato de entrada de posix mktime. mktime toma una estructura "expresada como tiempo local, para representar el tiempo del calendario" y la convierte para usted. Sin embargo, boost p_time no hace ninguna conversión de TZ para usted al completar la tm struct. Por lo tanto, si está buscando un tiempo de época absoluto como el número de segundos desde el UTC del 1 de enero de 1970 a medianoche y el TZ local de su máquina no es GMT, esta llamada no le proporcionará lo que desea. Restar una época explícitamente construida y tomar la segunda diferencia es clara, obvia y segura a tz. – timmyl
- 1. cómo obtener boost :: posix_time :: ptime desde cadena formateada
- 2. Una forma de activar boost :: posix_time :: ptime en un __int64
- 3. get boost :: posix_time :: time_duration en segundos
- 4. Obtenga el año de boost ptime
- 5. ¿Cómo cambiar el aumento de C++ posix_time :: la resolución de ptime a milisegundos?
- 6. marca de tiempo unix para aumentar :: posix_time :: ptime
- 7. cómo redondear hasta la siguiente hora dado un impulso :: :: posix_time ptime
- 8. ¿Cómo convierto un std :: string a un boost :: gregorian :: date?
- 9. boost :: date_time, g ++ - 4.7.0, error de compilación
- 10. ¿Cómo obtener el tiempo GMT en milisegundos utilizando boost Date_Time?
- 11. Aumento de ptime en MinGW no es seguro para roscas
- 12. Conversión de fecha/hora: representación de cadena a time_t
- 13. Cómo convertir una marca de tiempo de época fraccional (doble) a std :: chrono :: time_point?
- 14. Interoperabilidad entre boost :: date_time y std :: chrono
- 15. ¿Cómo extraer horas de time_t?
- 16. Convertir cadena de __DATE__ a un time_t
- 17. Cómo convierto jstring a wchar_t *
- 18. ¿Cómo convierto Double [] a double []?
- 19. ¿Cómo convierto milisegundos a TDateTime?
- 20. ¿Cómo convierto System.Windows.Media.SolidcolorBrush a System.Drawing.Color?
- 21. ASN1_TIME to time_t conversión
- 22. ¿Cómo conseguir la hora, minutos y segundos
- 23. Boost C++ date_time microsec_clock y second_clock
- 24. Convierte int64_t en time_duration
- 25. Representación de cadena de time_t?
- 26. convierto HashBytes a VARCHAR
- 27. Boost Tema - ¿Cómo reconocer interrumpo
- 28. boost :: date_time (boost-145) usando uint de 64 bits con cálculos de microsec, sin truncamiento
- 29. ¿Cómo formatear el objeto de fecha y hora con el formato dd/mm/aaaa?
- 30. C++ ¿Por qué mi fecha de análisis no es insegura?
Sólo un pensamiento; Estoy usando boost :: posix_time :: from_time_t (0) en lugar de tiempo explícito en el calendario gregoriano, para obtener un punto de referencia que se ajustará automáticamente a la época del sistema compilado. – Rawler
@Rawler, eso es mucho mejor: he encontrado que la época real es aparentemente de 2000 n antes de lo que representa 'gregorian :: date (1970,1,1)'. –
@BrianCain ¿De dónde sacaste 2000n antes de la marca de tiempo de la época infame? Por lo que recuerdo y he leído, siempre he oído que la época es 1970-01-01 00: 00: 00.0 UTC. –