How do I get the unix timestamp in C as an int?

后端 未结 5 486
借酒劲吻你
借酒劲吻你 2020-12-07 22:05

I would like to get the current timestamp and print it out using fprintf.

相关标签:
5条回答
  • 2020-12-07 22:34

    With second precision, you can print tv_sec field of timeval structure that you get from gettimeofday() function. For example:

    #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;
    }
    

    Example of compiling and running:

    $ gcc -Wall -o test ./test.c 
    $ ./test 
    Seconds since Jan. 1, 1970: 1343845834
    

    Note, however, that its been a while since epoch and so long int is used to fit a number of seconds these days.

    There are also functions to print human-readable times. See this manual page for details. Here goes an example using ctime():

    #include <time.h>
    #include <stdio.h>
    
    int main()
    {
        time_t clk = time(NULL);
        printf("%s", ctime(&clk));
        return 0;
    }
    

    Example run & output:

    $ gcc -Wall -o test ./test.c 
    $ ./test 
    Wed Aug  1 14:43:23 2012
    $ 
    
    0 讨论(0)
  • 2020-12-07 22:46

    An important point is to consider if you perform tasks based on difference between 2 timestamps because you will get odd behavior if you generate it with gettimeofday(), and even clock_gettime(CLOCK_REALTIME,..) at the moment where you will set the time of your system.

    To prevent such problem, use clock_gettime(CLOCK_MONOTONIC_RAW, &tms) instead.

    0 讨论(0)
  • 2020-12-07 22:49

    For 32-bit systems:

    fprintf(stdout, "%u\n", (unsigned)time(NULL)); 
    

    For 64-bit systems:

    fprintf(stdout, "%lu\n", (unsigned long)time(NULL)); 
    
    0 讨论(0)
  • 2020-12-07 22:49
    #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);
    }
    

    And will get similar result:
    Seconds since January 1, 1970 = 1476107865

    0 讨论(0)
  • 2020-12-07 22:59

    Is just casting the value returned by time()

    #include <stdio.h>
    #include <time.h>
    
    int main(void) {
        printf("Timestamp: %d\n",(int)time(NULL));
        return 0;
    }
    

    what you want?

    $ gcc -Wall -Wextra -pedantic -std=c99 tstamp.c && ./a.out
    Timestamp: 1343846167
    

    To get microseconds since the epoch, from C11 on, the portable way is to use

    int timespec_get(struct timespec *ts, int base)
    

    Unfortunately, C11 is not yet available everywhere, so as of now, the closest to portable is using one of the POSIX functions clock_gettime or gettimeofday (marked obsolete in POSIX.1-2008, which recommends clock_gettime).

    The code for both functions is nearly identical:

    #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;
    }
    
    0 讨论(0)
提交回复
热议问题