resumen - ¿Cómo obtengo la marca de tiempo de Unix en C como int?
unix caracteristicas (4)
Me gustaría obtener la marca de tiempo actual e imprimirla usando fprintf
.
Con la segunda precisión, puede imprimir el campo timeval
estructura timeval
que obtiene de la función gettimeofday()
. Por ejemplo:
#include <sys/time.h>
#include <stdio.h>
int main()
{
struct timeval tv;
gettimeofday(&tv, NULL);
printf("Seconds since Jan. 1, 1970: %ld/n", tv.tv_sec);
return 0;
}
Ejemplo de compilación y ejecución:
$ gcc -Wall -o test ./test.c
$ ./test
Seconds since Jan. 1, 1970: 1343845834
Tenga en cuenta, sin embargo, que ha pasado un tiempo desde epoch y por lo long int
se utiliza para adaptarse a un número de segundos en estos días.
También hay funciones para imprimir tiempos legibles por humanos. Vea esta página del manual para más detalles. Aquí va un ejemplo usando ctime()
:
#include <time.h>
#include <stdio.h>
int main()
{
time_t clk = time(NULL);
printf("%s", ctime(&clk));
return 0;
}
Ejemplo de ejecución y salida:
$ gcc -Wall -o test ./test.c
$ ./test
Wed Aug 1 14:43:23 2012
$
Para sistemas de 32 bits:
fprintf(stdout, "%u/n", (unsigned)time(NULL));
Para sistemas de 64 bits:
fprintf(stdout, "%lu/n", (unsigned long)time(NULL));
Solo está emitiendo el valor devuelto por el time()
#include <stdio.h>
#include <time.h>
int main(void) {
printf("Timestamp: %d/n",(int)time(NULL));
return 0;
}
¿Lo que quieras?
$ gcc -Wall -Wextra -pedantic -std=c99 tstamp.c && ./a.out
Timestamp: 1343846167
Para obtener microsegundos desde la época, desde C11 en adelante, la forma portátil es usar
int timespec_get(struct timespec *ts, int base)
Desafortunadamente, C11 aún no está disponible en todas partes, por lo que lo más cercano a lo portátil es usar una de las funciones POSIX clock_gettime
o clock_gettime
(marcado como obsoleto en POSIX.1-2008, que recomienda clock_gettime
).
El código para ambas funciones es casi idéntico:
#include <stdio.h>
#include <time.h>
#include <stdint.h>
#include <inttypes.h>
int main(void) {
struct timespec tms;
/* The C11 way */
/* if (! timespec_get(&tms, TIME_UTC)) { */
/* POSIX.1-2008 way */
if (clock_gettime(CLOCK_REALTIME,&tms)) {
return -1;
}
/* seconds, multiplied with 1 million */
int64_t micros = tms.tv_sec * 1000000;
/* Add full microseconds */
micros += tms.tv_nsec/1000;
/* round up if necessary */
if (tms.tv_nsec % 1000 >= 500) {
++micros;
}
printf("Microseconds: %"PRId64"/n",micros);
return 0;
}
#include <stdio.h>
#include <time.h>
int main ()
{
time_t seconds;
seconds = time(NULL);
printf("Seconds since January 1, 1970 = %ld/n", seconds);
return(0);
}
Y obtendrá un resultado similar:
Segundos desde el 1 de enero de 1970 = 1476107865