X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_time.c;h=6789758d4e2460abad4259a6da047550b5903fac;hb=af6222065f1f5d8969afdde89c9f26a73e1e1690;hp=aac6135e28f8bf7d1be5966d5316a64c28200e93;hpb=488c2ca9e3f6f6082f192bdd5d737c6cd1298ba2;p=collectd.git diff --git a/src/utils_time.c b/src/utils_time.c index aac6135e..6789758d 100644 --- a/src/utils_time.c +++ b/src/utils_time.c @@ -61,4 +61,39 @@ cdtime_t cdtime (void) /* {{{ */ } /* }}} cdtime_t cdtime */ #endif +size_t cdtime_to_iso8601 (char *s, size_t max, cdtime_t t) /* {{{ */ +{ + struct timespec t_spec; + struct tm t_tm; + + size_t len; + + CDTIME_T_TO_TIMESPEC (t, &t_spec); + NORMALIZE_TIMESPEC (t_spec); + + if (localtime_r ((time_t *)&t_spec.tv_sec, &t_tm) == NULL) { + char errbuf[1024]; + ERROR ("cdtime_to_iso8601: localtime_r failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + return (0); + } + + len = strftime (s, max, "%Y-%m-%dT%H:%M:%S", &t_tm); + if (len == 0) + return 0; + + if (max - len > 2) { + int n = snprintf (s + len, max - len, ".%09i", (int)t_spec.tv_nsec); + len += (n < max - len) ? n : max - len; + } + + if (max - len > 3) { + int n = strftime (s + len, max - len, "%z", &t_tm); + len += (n < max - len) ? n : max - len; + } + + s[max - 1] = '\0'; + return len; +} /* }}} size_t cdtime_to_iso8601 */ + /* vim: set sw=2 sts=2 et fdm=marker : */