lib/timeutils: implement timespec formatting

Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
This commit is contained in:
Thomas Weißschuh 2023-06-27 08:57:09 +02:00
parent 136f4874f4
commit b9abaae312
2 changed files with 18 additions and 6 deletions

View file

@ -77,6 +77,7 @@ enum {
int strtimeval_iso(const struct timeval *tv, int flags, char *buf, size_t bufsz); int strtimeval_iso(const struct timeval *tv, int flags, char *buf, size_t bufsz);
int strtm_iso(const struct tm *tm, int flags, char *buf, size_t bufsz); int strtm_iso(const struct tm *tm, int flags, char *buf, size_t bufsz);
int strtime_iso(const time_t *t, int flags, char *buf, size_t bufsz); int strtime_iso(const time_t *t, int flags, char *buf, size_t bufsz);
int strtimespec_iso(const struct timespec *t, int flags, char *buf, size_t bufsz);
#define UL_SHORTTIME_THISYEAR_HHMM (1 << 1) #define UL_SHORTTIME_THISYEAR_HHMM (1 << 1)

View file

@ -522,24 +522,35 @@ static int format_iso_time(const struct tm *tm, uint32_t nsec, int flags, char *
return -1; return -1;
} }
/* timeval to ISO 8601 */ /* timespec to ISO 8601 */
int strtimeval_iso(const struct timeval *tv, int flags, char *buf, size_t bufsz) int strtimespec_iso(const struct timespec *ts, int flags, char *buf, size_t bufsz)
{ {
struct tm tm; struct tm tm;
struct tm *rc; struct tm *rc;
if (flags & ISO_GMTIME) if (flags & ISO_GMTIME)
rc = gmtime_r(&tv->tv_sec, &tm); rc = gmtime_r(&ts->tv_sec, &tm);
else else
rc = localtime_r(&tv->tv_sec, &tm); rc = localtime_r(&ts->tv_sec, &tm);
if (rc) if (rc)
return format_iso_time(&tm, tv->tv_usec * NSEC_PER_USEC, flags, buf, bufsz); return format_iso_time(&tm, ts->tv_nsec, flags, buf, bufsz);
warnx(_("time %"PRId64" is out of range."), (int64_t)(tv->tv_sec)); warnx(_("time %"PRId64" is out of range."), (int64_t)(ts->tv_sec));
return -1; return -1;
} }
/* timeval to ISO 8601 */
int strtimeval_iso(const struct timeval *tv, int flags, char *buf, size_t bufsz)
{
struct timespec ts = {
.tv_sec = tv->tv_sec,
.tv_nsec = tv->tv_usec * NSEC_PER_USEC,
};
return strtimespec_iso(&ts, flags, buf, bufsz);
}
/* struct tm to ISO 8601 */ /* struct tm to ISO 8601 */
int strtm_iso(const struct tm *tm, int flags, char *buf, size_t bufsz) int strtm_iso(const struct tm *tm, int flags, char *buf, size_t bufsz)
{ {