How to Get a UTC ISO timestamp in C under Linux
TL;DR:
#include <time.h>
time_t t = time(NULL);
assert(t != ((time_t)-1)); // error handling
struct tm tm; memset(&tm, 0, sizeof(tm));
assert(gmtime_r(&t, &tm) != NULL); // error handling
printf("%04d-%02d-%02dT%02d:%02d:%02d\n",
1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
Longer answer
#include <time.h> time_t time(time_t *tloc);
The time_t type is an integer type selected during compilation, which gets to store the number of seconds since the Unix Epoch, 1st of January 1970, UTC. Ideally sizeof(time_t) should be 8 bytes, so it doesn't overflow after 2038.
Note that the argument passed into time() should always be NULL in new code, according to man pages.
On error, time() returns a (time_t)-1 and errno is set.
#include <time.h> struct tm *gmtime(const time_t *timep); struct tm *gmtime_r(const time_t *restrict timep, struct tm *restrict result);
The struct tm is defined as follows in Linux headers:
struct tm {
int tm_sec; /* Seconds (0-60) NOTE: The "60" value accomodates leap seconds */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */
int tm_year; /* Year - 1900 */
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
The gmtime function uses a statically-allocated struct and overwrites it in subsequent calls. Use gmtime_r so that the function outputs the result in a user-supplied struct in a thread-safe manner. (_r stands for “re-entrant”).
On error, gmtime returns a NULL pointer and errno is set.
For higher-resolution time, into the nanoseconds, one can look at calling clock_gettime() with CLOCK_REALTIME, or the simpler gettimeofday(). The man page links can be found below in “References”.
References
- “The Linux Programming Interface” by Michael Kerrisk (2010).
time(2)from Linux Programmer's Manual: https://man7.org/linux/man-pages/man2/time.2.html.ctime(3)from Linux Programmer's Manual: https://man7.org/linux/man-pages/man3/ctime.3.htmltime(7)from Linux Programmer's Manual: https://man7.org/linux/man-pages/man7/time.7.htmlclock_gettime(2)from Linux Programmer's Manual: https://man7.org/linux/man-pages/man2/clock_gettime.2.html.gettimeofday(2)from Linux Programmer's Manual: https://man7.org/linux/man-pages/man2/gettimeofday.2.html.