diff -upNr b/lib/isc/include/isc/util.h a/lib/isc/include/isc/util.h --- b/lib/isc/include/isc/util.h 2019-07-30 19:52:09.600000000 +0800 +++ a/lib/isc/include/isc/util.h 2019-07-30 21:39:03.400000000 +0800 @@ -233,6 +233,7 @@ * Time */ #define TIME_NOW(tp) RUNTIME_CHECK(isc_time_now((tp)) == ISC_R_SUCCESS) +#define TIME_REAL_NOW(tp) RUNTIME_CHECK(isc_time_real_now((tp)) == ISC_R_SUCCESS) #ifdef CLOCK_BOOTTIME #define TIME_MONOTONIC(tp) RUNTIME_CHECK(isc_time_boottime((tp)) == ISC_R_SUCCESS) #endif diff -upNr b/lib/isc/log.c a/lib/isc/log.c --- b/lib/isc/log.c 2019-07-30 19:52:09.610000000 +0800 +++ a/lib/isc/log.c 2019-07-30 21:39:03.410000000 +0800 @@ -1498,7 +1498,7 @@ isc_log_doit(isc_log_t *lctx, isc_logcat time_string[0] == '\0') { isc_time_t isctime; - TIME_NOW(&isctime); + TIME_REAL_NOW(&isctime); isc_time_formattimestamp(&isctime, time_string, sizeof(time_string)); } @@ -1545,7 +1545,7 @@ isc_log_doit(isc_log_t *lctx, isc_logcat * which fall within the duplicate_interval * range. */ - TIME_NOW(&oldest); + TIME_REAL_NOW(&oldest); if (isc_time_subtract(&oldest, &interval, &oldest) != ISC_R_SUCCESS) @@ -1622,7 +1622,7 @@ isc_log_doit(isc_log_t *lctx, isc_logcat strlcpy(message->text, lctx->buffer, size); - TIME_NOW(&message->time); + TIME_REAL_NOW(&message->time); ISC_LINK_INIT(message, link); ISC_LIST_APPEND(lctx->messages, diff -upNr b/lib/isc/unix/include/isc/time.h a/lib/isc/unix/include/isc/time.h --- b/lib/isc/unix/include/isc/time.h 2019-07-30 19:52:09.600000000 +0800 +++ a/lib/isc/unix/include/isc/time.h 2019-07-30 21:39:03.400000000 +0800 @@ -149,6 +149,8 @@ isc_time_now(isc_time_t *t); */ isc_result_t +isc_time_real_now(isc_time_t *t); +isc_result_t isc_time_nowplusinterval(isc_time_t *t, const isc_interval_t *i); /*%< * Set *t to the current absolute time + i. diff -upNr b/lib/isc/unix/time.c a/lib/isc/unix/time.c --- b/lib/isc/unix/time.c 2019-07-30 19:52:09.600000000 +0800 +++ a/lib/isc/unix/time.c 2019-07-30 21:39:03.400000000 +0800 @@ -105,6 +129,50 @@ isc_time_isepoch(const isc_time_t *t) { isc_result_t +isc_time_real_now(isc_time_t *t) { + struct timeval tv; + char strbuf[ISC_STRERRORSIZE]; + + REQUIRE(t != NULL); + + if (gettimeofday(&tv, NULL) == -1) { + isc__strerror(errno, strbuf, sizeof(strbuf)); + UNEXPECTED_ERROR(__FILE__, __LINE__, "%s", strbuf); + return (ISC_R_UNEXPECTED); + } + + /* + * Does POSIX guarantee the signedness of tv_sec and tv_usec? If not, + * then this test will generate warnings for platforms on which it is + * unsigned. In any event, the chances of any of these problems + * happening are pretty much zero, but since the libisc library ensures + * certain things to be true ... + */ +#if ISC_FIX_TV_USEC + fix_tv_usec(&tv); + if (tv.tv_sec < 0) + return (ISC_R_UNEXPECTED); +#else + if (tv.tv_sec < 0 || tv.tv_usec < 0 || tv.tv_usec >= US_PER_S) + return (ISC_R_UNEXPECTED); +#endif + + /* + * Ensure the tv_sec value fits in t->seconds. + */ + if (sizeof(tv.tv_sec) > sizeof(t->seconds) && + ((tv.tv_sec | (unsigned int)-1) ^ (unsigned int)-1) != 0U) + return (ISC_R_RANGE); + + t->seconds = tv.tv_sec; + t->nanoseconds = tv.tv_usec * NS_PER_US; + + return (ISC_R_SUCCESS); +} + + + +isc_result_t isc_time_now(isc_time_t *t) { struct timeval tv; char strbuf[ISC_STRERRORSIZE];