From f3ed2c0a825b4eb44245b7f108f2f292e666463b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 19 Aug 2019 22:37:16 +0200 Subject: [PATCH] time/ISO8601: support omitting seconds --- src/time/ISO8601.cxx | 9 ++++++--- test/TestISO8601.cxx | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/time/ISO8601.cxx b/src/time/ISO8601.cxx index 6671a8ca4..f4d0d5d38 100644 --- a/src/time/ISO8601.cxx +++ b/src/time/ISO8601.cxx @@ -133,12 +133,15 @@ ParseISO8601(const char *s) /* parse the time of day */ if (*s == 'T') { ++s; - end = strptime(s, "%T", &tm); - if (end == nullptr) + + if ((end = strptime(s, "%T", &tm)) != nullptr) + precision = std::chrono::seconds(1); + else if ((end = strptime(s, "%H:%M", &tm)) != nullptr) + precision = std::chrono::minutes(1); + else throw std::runtime_error("Failed to parse time of day"); s = end; - precision = std::chrono::seconds(1); } auto tp = TimeGm(tm); diff --git a/test/TestISO8601.cxx b/test/TestISO8601.cxx index e97798831..6b2506cce 100644 --- a/test/TestISO8601.cxx +++ b/test/TestISO8601.cxx @@ -58,6 +58,10 @@ static constexpr struct { /* without time zone */ { "2019-02-04T16:46:41", 1549298801, std::chrono::seconds(1) }, + /* without seconds */ + { "2019-02-04T16:46", 1549298760, std::chrono::minutes(1) }, + { "2019-02-04T16:46Z", 1549298760, std::chrono::minutes(1) }, + /* with time zone */ { "2019-02-04T16:46:41+02", 1549291601, std::chrono::seconds(1) }, { "2019-02-04T16:46:41+0200", 1549291601, std::chrono::seconds(1) },