struct timeval {
        time_t          tv_sec;
        suseconds_t     tv_usec;
};
The tv_sec member represents the elapsed time, in whole seconds. The tv_usec member captures rest of the elapsed time, represented as the number of microseconds.
struct timespec {
        time_t          tv_sec;
        long            tv_nsec;
};
The tv_sec member is again the elapsed time in whole seconds. The tv_nsec member represents the rest of the elapsed time in nanoseconds.
A microsecond is equal to one millionth of a second, 1000 nanoseconds, or 1/1000 milliseconds. To ease the conversions, the macros Fn TIMEVAL_TO_TIMESPEC and Fn TIMESPEC_TO_TIMEVAL can be used to convert between struct timeval and struct timespec
static void
example(struct timespec *spec, time_t minutes)
{
        struct timeval elapsed;
        (void)gettimeofday(&elapsed, NULL);
        _DIAGASSERT(spec != NULL);
        TIMEVAL_TO_TIMESPEC(&elapsed, spec);
        /* Add the offset for timeout in minutes. */
        spec->tv_sec = spec->tv_sec + minutes * 60;
}
A better alternative would use the more precise clock_gettime2.