diff --git a/src/song/Filter.cxx b/src/song/Filter.cxx index 57e557047..17913cbdb 100644 --- a/src/song/Filter.cxx +++ b/src/song/Filter.cxx @@ -113,7 +113,7 @@ ParseTimeStamp(const char *s) return std::chrono::system_clock::from_time_t((time_t)value); /* try ISO 8601 */ - return ParseISO8601(s); + return ParseISO8601(s).first; } static constexpr bool diff --git a/src/time/ISO8601.cxx b/src/time/ISO8601.cxx index 3aaa40eab..a7435630a 100644 --- a/src/time/ISO8601.cxx +++ b/src/time/ISO8601.cxx @@ -58,7 +58,8 @@ FormatISO8601(std::chrono::system_clock::time_point tp) return FormatISO8601(GmTime(tp)); } -std::chrono::system_clock::time_point +std::pair ParseISO8601(const char *s) { assert(s != nullptr); @@ -73,6 +74,10 @@ ParseISO8601(const char *s) if (end == nullptr || *end != 0) throw std::runtime_error("Failed to parse time stamp"); - return TimeGm(tm); + std::chrono::system_clock::duration precision = std::chrono::seconds(1); + + auto tp = TimeGm(tm); + + return std::make_pair(tp, precision); #endif /* !_WIN32 */ } diff --git a/src/time/ISO8601.hxx b/src/time/ISO8601.hxx index b6788a458..061e8f529 100644 --- a/src/time/ISO8601.hxx +++ b/src/time/ISO8601.hxx @@ -36,6 +36,7 @@ #include "util/Compiler.h" #include +#include #include @@ -50,7 +51,16 @@ gcc_pure StringBuffer<64> FormatISO8601(std::chrono::system_clock::time_point tp); -std::chrono::system_clock::time_point +/** + * Parse a time stamp in ISO8601 format. + * + * Throws on error. + * + * @return a pair consisting of the time point and the specified + * precision; e.g. for a date, the second value is "one day" + */ +std::pair ParseISO8601(const char *s); #endif