summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2019-08-19 22:35:47 +0200
committerMax Kellermann <max@musicpd.org>2019-12-16 23:24:43 +0100
commitb06825829bbc71876dc8ba2c3d7acdc96e9f208e (patch)
tree25b1cf47dfc2a818ffc28a2ee234781b44326a7a
parentba4cd47fd8cb853f1b4e04c7dcb5221bb0c05150 (diff)
time/ISO8601: allow omitting the "Z" suffix
And allow "Z" suffix after date.
-rw-r--r--NEWS3
-rw-r--r--src/time/ISO8601.cxx5
-rw-r--r--test/TestISO8601.cxx6
3 files changed, 12 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 8a8c7f905..986f22c87 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,7 @@
ver 0.21.17 (not yet released)
* protocol
- - relax the ISO 8601 parser: allow omitting the time of day
+ - relax the ISO 8601 parser: allow omitting the time of day and the "Z"
+ suffix
* archive
- zzip: improve error reporting
* outputs
diff --git a/src/time/ISO8601.cxx b/src/time/ISO8601.cxx
index 4811813fb..f08938e4e 100644
--- a/src/time/ISO8601.cxx
+++ b/src/time/ISO8601.cxx
@@ -83,7 +83,7 @@ ParseISO8601(const char *s)
/* parse the time of day */
if (*s == 'T') {
++s;
- end = strptime(s, "%TZ", &tm);
+ end = strptime(s, "%T", &tm);
if (end == nullptr)
throw std::runtime_error("Failed to parse time of day");
@@ -93,6 +93,9 @@ ParseISO8601(const char *s)
auto tp = TimeGm(tm);
+ if (*s == 'Z')
+ ++s;
+
if (*s != 0)
throw std::runtime_error("Garbage at end of time stamp");
diff --git a/test/TestISO8601.cxx b/test/TestISO8601.cxx
index d5e8dd2dc..6fdc11dc8 100644
--- a/test/TestISO8601.cxx
+++ b/test/TestISO8601.cxx
@@ -51,6 +51,12 @@ static constexpr struct {
{ "2019-02-04", 1549238400, std::chrono::hours(24) },
{ "2018-12-31", 1546214400, std::chrono::hours(24) },
{ "2019-01-01", 1546300800, std::chrono::hours(24) },
+
+ /* date with time zone */
+ { "2019-02-04Z", 1549238400, std::chrono::hours(24) },
+
+ /* without time zone */
+ { "2019-02-04T16:46:41", 1549298801, std::chrono::seconds(1) },
};
TEST(ISO8601, Parse)