time/ISO8601: support YYYY-MM (without day of month)
This commit is contained in:
parent
764eaadd25
commit
0c28d8dcbe
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2007-2019 Content Management AG
|
* Copyright 2007-2020 CM4all GmbH
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* author: Max Kellermann <mk@cm4all.com>
|
* author: Max Kellermann <mk@cm4all.com>
|
||||||
@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include "ISO8601.hxx"
|
#include "ISO8601.hxx"
|
||||||
#include "Convert.hxx"
|
#include "Convert.hxx"
|
||||||
|
#include "Math.hxx"
|
||||||
#include "util/StringBuffer.hxx"
|
#include "util/StringBuffer.hxx"
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
@ -169,6 +170,13 @@ ParseTimeOfDay(const char *s, struct tm &tm,
|
|||||||
return end;
|
return end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
StrptimeFull(const char *s, const char *fmt, struct tm *tm) noexcept
|
||||||
|
{
|
||||||
|
const char *end = strptime(s, fmt, tm);
|
||||||
|
return end != nullptr && *end == 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::pair<std::chrono::system_clock::time_point,
|
std::pair<std::chrono::system_clock::time_point,
|
||||||
@ -184,6 +192,15 @@ ParseISO8601(const char *s)
|
|||||||
#else
|
#else
|
||||||
struct tm tm{};
|
struct tm tm{};
|
||||||
|
|
||||||
|
if (StrptimeFull(s, "%Y-%m", &tm)) {
|
||||||
|
/* full month */
|
||||||
|
tm.tm_mday = 1;
|
||||||
|
const auto start = TimeGm(tm);
|
||||||
|
EndOfMonth(tm);
|
||||||
|
const auto end = TimeGm(tm);
|
||||||
|
return {start, end - start};
|
||||||
|
}
|
||||||
|
|
||||||
/* parse the date */
|
/* parse the date */
|
||||||
const char *end = strptime(s, "%F", &tm);
|
const char *end = strptime(s, "%F", &tm);
|
||||||
if (end == nullptr) {
|
if (end == nullptr) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2007-2019 Content Management AG
|
* Copyright 2007-2020 CM4all GmbH
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* author: Max Kellermann <mk@cm4all.com>
|
* author: Max Kellermann <mk@cm4all.com>
|
||||||
|
@ -46,6 +46,11 @@ static constexpr struct {
|
|||||||
{ "2018-12-31T23:59:59Z", 1546300799, std::chrono::seconds(1) },
|
{ "2018-12-31T23:59:59Z", 1546300799, std::chrono::seconds(1) },
|
||||||
{ "2019-01-01T00:00:00Z", 1546300800, std::chrono::seconds(1) },
|
{ "2019-01-01T00:00:00Z", 1546300800, std::chrono::seconds(1) },
|
||||||
|
|
||||||
|
/* full month */
|
||||||
|
{ "1970-01", 0, std::chrono::hours(24 * 31) },
|
||||||
|
{ "2019-02", 1548979200, std::chrono::hours(24 * 28) },
|
||||||
|
{ "2019-01", 1546300800, std::chrono::hours(24 * 31) },
|
||||||
|
|
||||||
/* only date */
|
/* only date */
|
||||||
{ "1970-01-01", 0, std::chrono::hours(24) },
|
{ "1970-01-01", 0, std::chrono::hours(24) },
|
||||||
{ "2019-02-04", 1549238400, std::chrono::hours(24) },
|
{ "2019-02-04", 1549238400, std::chrono::hours(24) },
|
||||||
|
Loading…
Reference in New Issue
Block a user