mu-utils: support UTC in parse_date_time

Parsing dates known to be in UTC.
This commit is contained in:
Dirk-Jan C. Binnema 2023-08-21 18:26:12 +03:00
parent f73aad2b41
commit c1950ae0cb
2 changed files with 13 additions and 4 deletions

View File

@ -413,7 +413,7 @@ fixup_month(struct tm* tbuf)
Option<::time_t> Option<::time_t>
Mu::parse_date_time(const std::string& dstr, bool is_first) Mu::parse_date_time(const std::string& dstr, bool is_first, bool utc)
{ {
struct tm tbuf{}; struct tm tbuf{};
GDateTime *dtime{}; GDateTime *dtime{};
@ -442,12 +442,20 @@ Mu::parse_date_time(const std::string& dstr, bool is_first)
return Nothing; return Nothing;
fixup_month(&tbuf); fixup_month(&tbuf);
dtime = g_date_time_new_local(tbuf.tm_year + 1900, dtime = utc ?
g_date_time_new_utc(tbuf.tm_year + 1900,
tbuf.tm_mon + 1,
tbuf.tm_mday,
tbuf.tm_hour,
tbuf.tm_min,
tbuf.tm_sec) :
g_date_time_new_local(tbuf.tm_year + 1900,
tbuf.tm_mon + 1, tbuf.tm_mon + 1,
tbuf.tm_mday, tbuf.tm_mday,
tbuf.tm_hour, tbuf.tm_hour,
tbuf.tm_min, tbuf.tm_min,
tbuf.tm_sec); tbuf.tm_sec);
t = g_date_time_to_unix(dtime); t = g_date_time_to_unix(dtime);
g_date_time_unref(dtime); g_date_time_unref(dtime);

View File

@ -146,7 +146,7 @@ auto mu_join(Range&& range, std::string_view sepa) {
} }
template <typename T> template <typename T>
auto mu_time(T t, bool use_utc=false) { std::tm mu_time(T t={}, bool use_utc=false) {
::time_t tt{static_cast<::time_t>(t)}; ::time_t tt{static_cast<::time_t>(t)};
return use_utc ? fmt::gmtime(tt) : fmt::localtime(tt); return use_utc ? fmt::gmtime(tt) : fmt::localtime(tt);
} }
@ -253,10 +253,11 @@ static inline bool mu_print_encoded(fmt::format_string<T...> frm, T&&... args) n
* so 2018-05-05 is equivalent to 20180505. * so 2018-05-05 is equivalent to 20180505.
* @param first whether to fill out incomplete dates to the start (@true) or the * @param first whether to fill out incomplete dates to the start (@true) or the
* end (@false); ie. either 1972 -> 197201010000 or 1972 -> 197212312359 * end (@false); ie. either 1972 -> 197201010000 or 1972 -> 197212312359
* @param use_utc interpret @param date as UTC
* *
* @return the corresponding time_t or Nothing if parsing failed. * @return the corresponding time_t or Nothing if parsing failed.
*/ */
Option<::time_t> parse_date_time(const std::string& date, bool first); Option<::time_t> parse_date_time(const std::string& date, bool first, bool use_utc=false);
/** /**
* Crudely convert HTML to plain text. This attempts to scrape the * Crudely convert HTML to plain text. This attempts to scrape the