Convertir el tiempo de época en “fecha” real

Lo que quiero hacer es convertir un tiempo de época (segundos desde la medianoche 1/1/1970) a tiempo “real” (m / d / yh: m: s)

Hasta ahora, tengo el siguiente algoritmo, que para mí se siente un poco feo:

void DateTime::splitTicks(time_t time) { seconds = time % 60; time /= 60; minutes = time % 60; time /= 60; hours = time % 24; time /= 24; year = DateTime::reduceDaysToYear(time); month = DateTime::reduceDaysToMonths(time,year); day = int(time); } int DateTime::reduceDaysToYear(time_t &days) { int year; for (year=1970;days>daysInYear(year);year++) { days -= daysInYear(year); } return year; } int DateTime::reduceDaysToMonths(time_t &days,int year) { int month; for (month=0;days>daysInMonth(month,year);month++) days -= daysInMonth(month,year); return month; } 

Puede suponer que todos los miembros son seconds , minutes , hours , month , day y year .

Usar los bucles for para modificar la hora original se siente un poco apagado, y me preguntaba si hay una solución “mejor” para esto.

Tenga cuidado con los años bisiestos en sus días. Función de mes.

Si desea un rendimiento muy alto, puede calcular previamente el par para llegar al mes + año en un solo paso, y luego calcular el día / hora / min / seg.

Una buena solución es la que está en el código fuente de gmtime :

 /* * gmtime - convert the calendar time into broken down time */ /* $Header: gmtime.c,v 1.4 91/04/22 13:20:27 ceriel Exp $ */ #include  #include  #include "loc_time.h" struct tm * gmtime(register const time_t *timer) { static struct tm br_time; register struct tm *timep = &br_time; time_t time = *timer; register unsigned long dayclock, dayno; int year = EPOCH_YR; dayclock = (unsigned long)time % SECS_DAY; dayno = (unsigned long)time / SECS_DAY; timep->tm_sec = dayclock % 60; timep->tm_min = (dayclock % 3600) / 60; timep->tm_hour = dayclock / 3600; timep->tm_wday = (dayno + 4) % 7; /* day 0 was a thursday */ while (dayno >= YEARSIZE(year)) { dayno -= YEARSIZE(year); year++; } timep->tm_year = year - YEAR0; timep->tm_yday = dayno; timep->tm_mon = 0; while (dayno >= _ytab[LEAPYEAR(year)][timep->tm_mon]) { dayno -= _ytab[LEAPYEAR(year)][timep->tm_mon]; timep->tm_mon++; } timep->tm_mday = dayno + 1; timep->tm_isdst = 0; return timep; } 

La biblioteca estándar proporciona funciones para hacer esto. gmtime() o localtime() convertirá un time_t (segundos desde la época, es decir, 1 de enero de 1970 00:00:00) en una struct tm . strftime() se puede usar para convertir una struct tm en una cadena ( char* ) en función del formato que especifique.

ver: http://www.cplusplus.com/reference/clibrary/ctime/

Los cálculos de fecha / hora pueden ser complicados. Es mucho mejor que uses una solución existente en lugar de intentar hacer la tuya, a menos que tengas una buena razón.

Una manera fácil (aunque diferente al formato que quería):

 std::time_t result = std::time(nullptr); std::cout << std::asctime(std::localtime(&result)); 

Salida: Wed Sep 21 10:27:52 2011

Tenga en cuenta que el resultado devuelto se concatenará automáticamente con "\ n". Puede eliminarlo usando:

 std::string::size_type i = res.find("\n"); if (i != std::string::npos) res.erase(i, res.length()); 

Tomado de: http://en.cppreference.com/w/cpp/chrono/c/time

Si su tipo de hora original es time_t, debe usar funciones de time.h ie gmtime, etc. para obtener un código portátil. Los estándares de C / C ++ no especifican el formato interno (o incluso el tipo exacto) para time_t, por lo que no puede convertir o manipular directamente los valores de time_t.

Todo lo que se sabe es que time_t es “tipo aritmético”, pero los resultados de las operaciones aritméticas no están especificados; ni siquiera puede sumr / restar de manera confiable. En la práctica, muchos sistemas usan el tipo entero para time_t con formato interno de segundos desde epoch, pero esto no se aplica por estándares.

En resumen, use gmtime (y la funcionalidad time.h en general).

 time_t t = unixTime; cout << ctime(&t) << endl;