diff options
author | Karel Zak | 2016-05-11 15:31:02 +0200 |
---|---|---|
committer | Karel Zak | 2016-05-11 15:31:02 +0200 |
commit | 3c201431ee26c85b5c7fbcd85856c1df84065d64 (patch) | |
tree | a6ff93a95304bcf4f8241f409c2f3a6bf5c90ecb /lib/timeutils.c | |
parent | ramctl: add support for zram-control (diff) | |
download | kernel-qcow2-util-linux-3c201431ee26c85b5c7fbcd85856c1df84065d64.tar.gz kernel-qcow2-util-linux-3c201431ee26c85b5c7fbcd85856c1df84065d64.tar.xz kernel-qcow2-util-linux-3c201431ee26c85b5c7fbcd85856c1df84065d64.zip |
lib/timeutils: add strxxx_iso() functions
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'lib/timeutils.c')
-rw-r--r-- | lib/timeutils.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/lib/timeutils.c b/lib/timeutils.c index 854ef6915..c291043ed 100644 --- a/lib/timeutils.c +++ b/lib/timeutils.c @@ -338,3 +338,84 @@ int parse_timestamp(const char *t, usec_t *usec) return 0; } + +static char *format_iso_time(struct tm *tm, suseconds_t usec, int flags) +{ + char *s = NULL; + + if (flags & ISO_8601_DATE) + s = strfappend(s, "%4d-%.2d-%.2d", tm->tm_year + 1900, + tm->tm_mon + 1, tm->tm_mday); + if ((flags & ISO_8601_DATE) && (flags & ISO_8601_TIME)) + s = strnappend(s, (flags & ISO_8601_SPACE) ? " " : "T", 1); + + if (flags & ISO_8601_TIME) + s = strfappend(s, "%02d:%02d:%02d", tm->tm_hour, + tm->tm_min, tm->tm_sec); + if (flags & ISO_8601_USEC) + s = strfappend(s, ".%06ld", (long) usec); + + if (flags & ISO_8601_TIMEZONE) { + int zhour = - timezone / 60 / 60; + int zmin = labs(timezone / 60 % 60); + + s = strfappend(s, "%+02d:%02d", zhour, zmin); + } + + return s; +} + +char *strtimeval_iso(struct timeval *tv, int flags) +{ + struct tm tm = *localtime(&tv->tv_sec); + return format_iso_time(&tm, tv->tv_usec, flags); +} + +char *strtm_iso(struct tm *tm, int flags) +{ + return format_iso_time(tm, 0, flags); +} + +char *strtime_iso(time_t t, int flags) +{ + struct tm tm = *localtime(&t); + return format_iso_time(&tm, 0, flags); +} + + +#ifdef TEST_PROGRAM_TIMEUTILS + +int main(int argc, char *argv[]) +{ + struct timeval tv = { 0 }; + char *p; + + if (argc < 2) { + fprintf(stderr, "usage: %s <time> [<usec>]\n", argv[0]); + exit(EXIT_FAILURE); + } + + tv.tv_sec = strtos64_or_err(argv[1], "failed to parse <time>"); + if (argc == 3) + tv.tv_usec = strtos64_or_err(argv[2], "failed to parse <usec>"); + + p = strtimeval_iso(&tv, ISO_8601_DATE); + printf("Date: '%s'\n", p); + free(p); + + p = strtimeval_iso(&tv, ISO_8601_TIME); + printf("Time: '%s'\n", p); + free(p); + + p = strtimeval_iso(&tv, ISO_8601_DATE | ISO_8601_TIME | ISO_8601_USEC); + printf("Full: '%s'\n", p); + free(p); + + p = strtimeval_iso(&tv, ISO_8601_DATE | ISO_8601_TIME | ISO_8601_USEC | ISO_8601_TIMEZONE | ISO_8601_SPACE); + printf("Zone: '%s'\n", p); + free(p); + + return EXIT_SUCCESS; +} + +#endif /* TEST_PROGRAM */ |