How do I compare two timestamps in C?
Solution 1
googling timeval
give this first result. From that page:
It is often necessary to subtract two values of type struct timeval or struct timespec. Here is the best way to do this. It works even on some peculiar operating systems where the tv_sec member has an unsigned type.
/* Subtract the `struct timeval' values X and Y,
storing the result in RESULT.
Return 1 if the difference is negative, otherwise 0. */
int
timeval_subtract (result, x, y)
struct timeval *result, *x, *y;
{
/* Perform the carry for the later subtraction by updating y. */
if (x->tv_usec < y->tv_usec) {
int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
y->tv_usec -= 1000000 * nsec;
y->tv_sec += nsec;
}
if (x->tv_usec - y->tv_usec > 1000000) {
int nsec = (x->tv_usec - y->tv_usec) / 1000000;
y->tv_usec += 1000000 * nsec;
y->tv_sec -= nsec;
}
/* Compute the time remaining to wait.
tv_usec is certainly positive. */
result->tv_sec = x->tv_sec - y->tv_sec;
result->tv_usec = x->tv_usec - y->tv_usec;
/* Return 1 if result is negative. */
return x->tv_sec < y->tv_sec;
}
Solution 2
timercmp()
is just a macro in libc (sys/time.h):
# define timercmp(a, b, CMP) \
(((a)->tv_sec == (b)->tv_sec) ? \
((a)->tv_usec CMP (b)->tv_usec) : \
((a)->tv_sec CMP (b)->tv_sec))
If you need timersub()
:
# define timersub(a, b, result) \
do { \
(result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
(result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
if ((result)->tv_usec < 0) { \
--(result)->tv_sec; \
(result)->tv_usec += 1000000; \
} \
} while (0)
Related videos on Youtube
Vishal Kotcherlakota
A software engineer, trying to play with and learn as many things as I can. I've spent some time as a server monkey, playing with virtualization, networks, and Active Directory (yuck). I've been a Linux user for two decades, and am pretty comfortable with the tcsh and bash shells. I've also been known to knock out a timely Perl script or two (see http://xkcd.com/208/), but it doesn't always end well for me (see http://xkcd.com/1171/). I'm currently working on software development (primarily Java, Python, and C++) and Linux systems administration.
Updated on April 17, 2022Comments
-
Vishal Kotcherlakota about 1 month
I'm writing a socket program that maintains FIFO queues for two input sockets. When deciding which queue to service, the program pulls the most recent time-stamp from each queue.
I need a reliable method for comparing two
timeval
structs. I tried usingtimercmp()
, but my version of gcc doesn't support it, and documentation states that the function is not POSIX compliant.What should I do?
-
Eugene Bujak over 8 yearsNeeds defining _BSD_SOURCE macro if compiling on Linux.