diff options
author | Max Kellermann <max@musicpd.org> | 2019-08-19 22:35:47 +0200 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2019-12-16 23:24:43 +0100 |
commit | b06825829bbc71876dc8ba2c3d7acdc96e9f208e (patch) | |
tree | 25b1cf47dfc2a818ffc28a2ee234781b44326a7a | |
parent | ba4cd47fd8cb853f1b4e04c7dcb5221bb0c05150 (diff) |
time/ISO8601: allow omitting the "Z" suffix
And allow "Z" suffix after date.
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | src/time/ISO8601.cxx | 5 | ||||
-rw-r--r-- | test/TestISO8601.cxx | 6 |
3 files changed, 12 insertions, 2 deletions
@@ -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) |