diff options
author | P. J. McDermott <pj@pehjota.net> | 2021-08-29 16:48:48 (EDT) |
---|---|---|
committer | P. J. McDermott <pj@pehjota.net> | 2021-08-29 16:48:48 (EDT) |
commit | 1609f11f494c2d4870857f47a87c0e1955fd43ba (patch) | |
tree | 6d65286ebfd74d9db0c9fb5d68ad7a34a97047fc | |
parent | 611f78ea5e38b9d7ba9a0208fdcd387c7ce4f47e (diff) | |
download | atsign-1609f11f494c2d4870857f47a87c0e1955fd43ba.zip atsign-1609f11f494c2d4870857f47a87c0e1955fd43ba.tar.gz atsign-1609f11f494c2d4870857f47a87c0e1955fd43ba.tar.bz2 |
datetime: Support weekday-only dates
-rw-r--r-- | src/datetime-formats.c | 18 | ||||
-rw-r--r-- | src/datetime.c | 20 |
2 files changed, 36 insertions, 2 deletions
diff --git a/src/datetime-formats.c b/src/datetime-formats.c index d3e327b..0175d00 100644 --- a/src/datetime-formats.c +++ b/src/datetime-formats.c @@ -27,6 +27,24 @@ " %I%M %p ", " %H%M ", +/* Wed */ +" %a %I:%M:%S %p ", +" %a %H:%M:%S ", +" %a %I:%M %p ", +" %a %H:%M ", +" %a %I%M%S %p ", +" %a %H%M%S ", +" %a %I%M %p ", +" %a %H%M ", +" %I:%M:%S %p %a ", +" %H:%M:%S %a ", +" %I:%M %p %a ", +" %H:%M %a ", +" %I%M%S %p %a ", +" %H%M%S %a ", +" %I%M %p %a ", +" %H%M %a ", + /* ISO 8601: 1969-12-31 delimited by "T" */ " %Y-%m-%dT%H:%M:%S ", " %Y-%m-%dT%H:%M ", 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); |