tm_year time_t libreria gmtime ejemplo c++ c visual-studio-2008 time

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):

  1. Llame a getenv para guardar el valor actual de la variable de entorno TZ (si corresponde).
  2. Llame a putenv para cambiar la variable de entorno TZ a "UTC".
  3. Llame a _tzset para _tzset sus cambios.
  4. Llamar a mktime .
  5. Restaure el valor anterior de TZ y luego _tzset llamar a _tzset .