summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/song/Filter.cxx2
-rw-r--r--src/time/ISO8601.cxx9
-rw-r--r--src/time/ISO8601.hxx12
3 files changed, 19 insertions, 4 deletions
diff --git a/src/song/Filter.cxx b/src/song/Filter.cxx
index 9e1c4590a..9c0583845 100644
--- a/src/song/Filter.cxx
+++ b/src/song/Filter.cxx
@@ -120,7 +120,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<std::chrono::system_clock::time_point,
+ std::chrono::system_clock::duration>
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 <chrono>
+#include <utility>
#include <stddef.h>
@@ -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<std::chrono::system_clock::time_point,
+ std::chrono::system_clock::duration>
ParseISO8601(const char *s);
#endif