¿Cuáles son los argumentos válidos para la función de hora local?

Tengo un código aquí que utiliza la función de hora local. Pero para algunos valores de su argumento de entrada, el código se bloquea (se devuelve el puntero nulo). Quiero saber sobre el rango permitido para su entrada.

#include  #include  int main () { time_t rawtime; struct tm g; struct tm *gp; __int64 tim; tim = 7476811632013133299LL; // I know it's a weird number but valid for time_t rawtime = tim / 1000LL; gp = localtime(&rawtime); printf("Pointer gp = %p\n", gp); g = *gp; // this crahses because gp = NULL return 0; } 

Entonces, ¿qué se puede decir sobre el rango permisible de entrada a la función de hora local?

Desde la página de MSDN para localtime :

Devuelva un puntero al resultado de la estructura, o NULL si la fecha pasada a la función es:

  • Antes de la medianoche, 1 de enero de 1970.

  • Después de las 03:14:07, 19 de enero de 2038, UTC (usando _time32 y time32_t).

  • Después de las 23:59:59, 31 de diciembre de 3000, UTC (utilizando _time64 y __time64_t).

El rango permitido no está especificado por el estándar C.

Citando el borrador de la N1570 :

La función de hora local devuelve un puntero a la hora desglosada o un puntero nulo si la hora especificada no se puede convertir a la hora local.

Debe verificar si el resultado es NULL antes de intentar desreferenciarlo.

Por diversión, le pedí a mi comstackdor que intentara deducir el resultado:

 #include  #include  #include  #include  #include  bool Valid_time_t(time_t t) { struct tm *gp; gp = gmtime(&t); return gp != NULL; } time_t MaxValid_time_t(void) { time_t mn, mx, dt; time(&mn); do { time(&mx); } while (mx == mn); dt = mx - mn; for (;;) { time_t mx2 = mx + dt; // Technically a problem as int overflow is UB if (mx2 <= mx) break; mx = mx2; //printf("mx %jd\n", (intmax_t) mx); dt *= 2; } while (dt) { dt /= 2; time_t mx2 = mx + dt; // Technically a problem as int overflow is UB if (mx2 > mx) mx = mx2; //printf("mx_ %jd\n", (intmax_t) mx); } time_t mid; while (mn < mx) { mid = mx / 2 + mn / 2 + (mx % 2 + mn % 2) / 2; if (Valid_time_t(mid)) { mn = mid + 1; } else mx = mid - 1; // printf("3 %jd %jd %jd\n", (intmax_t) mn, (intmax_t) mid, (intmax_t) mx); } printf("%jd\n", (intmax_t) mn); printf("%s\n", asctime(gmtime(&mn))); return mn; } int main(void) { return (int) MaxValid_time_t(); } 

Salida gcc cygwin

 2147483647 Tue Jan 19 03:14:07 2038 

Salida MS VS 2010 con gmtime() en Valid_time_t() . (Curiosamente, 13 horas más tarde cuando se usa localtime() en Valid_time_t() . Aparece que el límite superior para localtime() difiere de gmtime() .

 32535291599 Thu Jan 01 20:59:59 3001 

La salida de OP cuando se usa localtime() en Valid_time_t() .

 32535244800 

YMMV