2010-05-08 12 views
40

No sé el tipo de datos de time_t. ¿Es un flotador doble o algo más? Porque si quiero mostrarlo necesito la etiqueta que corresponde con él para printf. Puedo manejar el resto desde allí para mostrar time_t, pero necesito saber el tipo de datos que se corresponde con él.¿Qué tipo de datos primitivos es time_t?

+2

Esto ya ha sido respondida aquí: http://stackoverflow.com/questions/471248/what-is-ultimately-a-time-t-typedef-to –

+1

Para aquellos que caen aquí en busca cómo printf a time_t, la misma discusión se aplica a clock_t y se ha realizado [aquí] (http://stackoverflow.com/questions/1083142/whats-the-correct-way-to-use-printf-to-print-a-clock -t). –

+0

@FirasAssaad Esa respuesta es para Linux. esta publicación no es específica del sistema operativo. – chux

Respuesta

26

Lamentablemente, no es completamente portátil. Por lo general, es integral, pero es can be cualquier "tipo entero o flotante real".

2

Siempre puedes usar algo como mktime para crear una hora conocida (medianoche, anoche) y usar difftime para obtener una diferencia de tiempo de doble precisión entre las dos. Para una solución independiente de la plataforma, a menos que vaya profundizando en los detalles de sus bibliotecas, no va a hacer mucho mejor que eso. Según la especificación C, la definición de time_t está definida por la implementación (lo que significa que cada implementación de la biblioteca puede definirla como prefiera, siempre que la biblioteca funcione con el uso se comporte según la especificación)

Dicho ser dicho, el tamaño de time_t en mi máquina Linux es de 8 bytes, lo que sugiere un int largo o un doble. Así que lo hice:

int main() 
{ 
    for(;;) 
    { 
     printf ("%ld\n", time(NULL)); 
     printf ("%f\n", time(NULL)); 
     sleep(1); 
    } 
    return 0; 
} 

el tiempo dado por el LD% incrementado en uno de cada paso y el flotador imprimieron 0.000 cada vez. Si está empeñado en usar printf para mostrar time_ts, su mejor opción es probar su propio experimento y ver cómo funciona en su plataforma y con su compilador.

+4

Sé que su comentario es antiguo, pero necesita usar 'printf ("% f \ n ", (double) time (NULL));' porque printf es una función vararg. –

28

Es específico de la plataforma. Pero puedes convertirlo a un tipo conocido.

printf("%lld\n", (long long) time(NULL)); 
+4

Eso supone que la plataforma admite (larga duración). Es precisamente cuando no necesita que sepa que time_t es solo de 32 bits. –

+2

También se supone que 'long long' es lo suficientemente grande como para contener el valor. En cuanto al estándar dice 'time_t' puede ser el número de yoctosegundos desde que se emitió el primer episodio de Monty Python (que lo hará más grande que 64 bits). – skyking

+0

@skyking no miente. Necesitará al menos un número de 111 bits para mantener dicho valor (aproximadamente 1.5e33). Hasta que pongan 'long long long long'' en el estándar, puede prepararse para el futuro almacenando todos sus' time_t's en 'uint64_t [2]'. – Balthamos

12

Puede usar la función difftime. Devuelve la diferencia entre dos valores dados de time_t, el valor de salida es double (consulte difftime documentation).

time_t actual_time; 
double actual_time_sec; 
actual_time = time(0); 
actual_time_sec = difftime(actual_time,0); 
printf("%g",actual_time_sec); 
Cuestiones relacionadas