From 1609f11f494c2d4870857f47a87c0e1955fd43ba Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Sun, 29 Aug 2021 16:48:48 -0400 Subject: datetime: Support weekday-only dates --- (limited to 'src/datetime.c') diff --git a/src/datetime.c b/src/datetime.c index c98f27a..797e955 100644 --- a/src/datetime.c +++ b/src/datetime.c @@ -38,6 +38,7 @@ datetime_parse(const char *input, time_t *arg_sec) struct tm arg_tm; time_t now_sec; struct tm *now_tm; + int wday; for (i = 0; DATETIME_FMTS_[i] != NULL; ++i) { arg_tm.tm_year = INT_MIN; @@ -61,14 +62,14 @@ datetime_parse(const char *input, time_t *arg_sec) if (arg_tm.tm_sec == INT_MIN) { arg_tm.tm_sec = 0; } - /* TODO: Support %a-only dates */ - if (arg_tm.tm_mday == INT_MIN) { + if (arg_tm.tm_mday == INT_MIN && arg_tm.tm_wday == INT_MIN) { /* No date specified; try today. */ now_sec = time(NULL); now_tm = localtime(&now_sec); arg_tm.tm_year = now_tm->tm_year; arg_tm.tm_mon = now_tm->tm_mon; arg_tm.tm_mday = now_tm->tm_mday; + arg_tm.tm_wday = now_tm->tm_wday; *arg_sec = mktime(&arg_tm); if (*arg_sec <= mktime(now_tm)) { /* Specified time already happened today; use tomorrow. @@ -82,6 +83,21 @@ datetime_parse(const char *input, time_t *arg_sec) arg_tm.tm_mday = now_tm->tm_mday; *arg_sec = mktime(&arg_tm); } + } else if (arg_tm.tm_mday == INT_MIN) { + /* Only a weekday specified; try tomorrow or next week. Uses + * same shortcut as above. */ + wday = arg_tm.tm_wday; + now_sec = time(NULL); + now_tm = localtime(&now_sec); + arg_tm.tm_year = now_tm->tm_year; + arg_tm.tm_mon = now_tm->tm_mon; + arg_tm.tm_mday = now_tm->tm_mday; + arg_tm.tm_wday = now_tm->tm_wday; + if (wday <= now_tm->tm_wday) { + wday += 7; + } + *arg_sec = mktime(&arg_tm); + *arg_sec += (60 * 60 * 24) * (wday - now_tm->tm_wday); } else if (arg_tm.tm_year == INT_MIN) { /* No year specified; try this year. */ now_sec = time(NULL); -- cgit v0.9.1