libreria - Problema C++ time_t
tm en c (2)
Solo un WAG pero pruebe lo siguiente:
timeinfo->tm_year = year - (unsigned long)1900;
timeinfo->tm_mon = month - (unsigned long)1;
Tengo problemas con la administración de fechas en C ++ (VS 2008).
De acuerdo con las especificaciones de MSDN , time_t
representa:
La cantidad de segundos desde el 1 de enero de 1970, a las 0:00 UTC
por lo tanto, he escrito este fragmento de código:
#include <stdio.h>
#include <time.h>
time_t GetDate(int year, int month, int day, int hour, int min, int sec)
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = gmtime ( &rawtime );
timeinfo->tm_year = year - 1900;
timeinfo->tm_mon = month - 1;
timeinfo->tm_mday = day;
timeinfo->tm_hour = hour;
timeinfo->tm_min = min;
timeinfo->tm_sec = sec;
timeinfo->tm_isdst = 0; // disable daylight saving time
time_t ret = mktime ( timeinfo );
return ret;
}
int main ()
{
time_t time_0 = GetDate(1970,1,1,0,0,0);
// time_0 == -1 !!!
time_t time_1 = GetDate(1970,1,1,1,0,0);
// time_1 == 0 !!!
return 0;
}
Parece que se modificó en 1 hora (es decir, el tiempo cero es el 1 de enero de 1970, 1:00 UTC).
Inicialmente, pensé que el problema podría provenir del indicador DayLightSaving, pero no cambia al cambiarlo.
Estoy haciendo algo mal ?
Gracias por adelantado
PD En teoría, no me importaría el valor de tiempo cero, porque es solo un tiempo de referencia.
Pero necesito estar seguro del valor, porque transfiero el código a otro idioma y necesito obtener exactamente los mismos resultados.
EDITAR:
aquí está la solución, gracias a Josh Kelley Respuesta
time_t mktimeUTC(struct tm* timeinfo)
{
// *** enter in UTC mode
char* oldTZ = getenv("TZ");
putenv("TZ=UTC");
_tzset();
// ***
time_t ret = mktime ( timeinfo );
// *** Restore previous TZ
if(oldTZ == NULL)
{
putenv("TZ=");
}
else
{
char buff[255];
sprintf(buff,"TZ=%s",oldTZ);
putenv(buff);
}
_tzset();
// ***
return ret;
}
mktime
toma una struct tm
da una hora local y devuelve el número de segundos desde el 1 de enero de 1970, a las 0:00 UTC . Por lo tanto, su GetDate(1970,1,1,0,0,0);
la llamada devolverá 0 si su zona horaria local es UTC pero puede devolver otros valores para otras zonas horarias.
Editar: Para una versión UTC de mktime
o su GetDate
, intente lo siguiente (no probado):