From d09bd9178f30e9e8bb1034efec7d713f53e924df Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
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) },