¿Cómo obtengo la marca de tiempo de Unix en C como un int?

5 minutos de lectura

¿Como obtengo la marca de tiempo de Unix en C
Tim

Me gustaría obtener la marca de tiempo actual e imprimirla usando fprintf.

  • ¿Hay alguna razón en particular por la que deba ser específicamente un int?

    –Dennis Meng

    1 de agosto de 2012 a las 18:29

  • @DennisMeng Si tuviera que adivinar, probablemente quería obtener la marca de tiempo como código de retorno y eliminar el manejo de salida.

    – KayleeFrye_onDeck

    7 de enero de 2017 a las 11:09

  • Perdón por necrobumpear esto, pero técnicamente Todas estas respuestas son incorrectas ya que time es no garantizado desde la época de Unix; según Wikipedia, puede ser cualquier época que elija el vendedor. También dice que a veces se usa 1900. Sin embargo, supongo que es desde la época de Unix en todos los sistemas, incluso remotamente cuerdos.

    – marka software

    25 de mayo de 2017 a las 1:10

1647560046 650 ¿Como obtengo la marca de tiempo de Unix en C
Dmitri Poroh

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

  • ¿Y si lo quisiera en microsegundos?

    – Tim

    1 de agosto de 2012 a las 21:26

  • Si desea microsegundos, debe usar una de estas funciones: clock_gettime con CLOCK_MONOTONIC clock id o gettimeofday. Pero tenga cuidado gettimeofday puede devolver valores de tiempo decrecientes.

    – Dmitri Poroh

    1 de agosto de 2012 a las 21:34

  • Tenga en cuenta que la función de tiempo (y clock_gettime con CLOCK_REALTIME id) también devuelve la hora del reloj de pared y puede devolver marcas de tiempo decrecientes.

    – Dmitri Poroh

    2 de agosto de 2012 a las 4:56

  • Puede evitar la conversión de tipos especificando la especificación de conversión adecuada. Puedes aprender lo que time_t (devuelto por time) se resuelve ejecutando el preprocesador en su archivo C (cpp main.c). En mi sistema de 64 bits time_t es long intlo que lleva a %ld especificación de conversión.

    – x-yuri

    18/10/2017 a las 20:39

  • #include <time.h>

    – ben

    3 sep 2018 a las 19:10

¿Como obtengo la marca de tiempo de Unix en C
daniel pescador

Es solo lanzar el valor devuelto por 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, a partir de ahora, lo más cercano a lo portátil es usar una de las funciones POSIX. clock_gettime o gettimeofday (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;
}

  • ¿Y si lo quisiera en microsegundos?

    – Tim

    1 de agosto de 2012 a las 21:26

  • Eso significaría que int no es el tipo apropiado en casi (?) todos los sistemas comunes. con típico INT_MAX = 2147483647si desea microsegundos, puede colocar un poco menos de 36 minutos en int. Y, por supuesto, generalmente no puedes usar time() luego. Portable, tendrías que usar timespec_get() luego. ¿Qué es lo que quieres? ¿Marca de tiempo de Unix o microsegundos (desde la época)?

    –Daniel Fischer

    1 de agosto de 2012 a las 21:39

  • Microsegundos desde época sería lo mejor.

    – Tim

    1 de agosto de 2012 a las 23:47

  • Hecho microsegundos, desafortunadamente descubrí que timespec_get es nuevo en C11, por lo que la portabilidad es un problema.

    –Daniel Fischer

    2 de agosto de 2012 a las 0:27

Con segunda precisión, puede imprimir tv_sec campo de timeval estructura que obtienes de gettimeofday() función. 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 la época y así long int se utiliza para ajustar un número de segundos en estos días.

También hay funciones para imprimir tiempos legibles por humanos. Ver esta página de manual para 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
$ 

  • Y gettimeofday es la llamada al sistema de Linux real.

    – Ciro Santilli Путлер Капут 六四事

    7 de octubre de 2017 a las 2:55

#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

1647560048 839 ¿Como obtengo la marca de tiempo de Unix en C
fralbo

Un punto importante es considerar si realiza tareas basadas en la diferencia entre 2 marcas de tiempo porque obtendrá un comportamiento extraño si lo genera con gettimeofday()e incluso clock_gettime(CLOCK_REALTIME,..) en el momento donde configurará la hora de su sistema.

Para evitar este problema, utilice clock_gettime(CLOCK_MONOTONIC_RAW, &tms) en lugar de.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad