summaryrefslogtreecommitdiffstats
path: root/src/datetime.c
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2021-08-29 14:32:12 (EDT)
committer P. J. McDermott <pj@pehjota.net>2021-08-29 15:58:36 (EDT)
commit9375a5d47217eea328d334ece74644814d2279d1 (patch)
tree51f9d37fe047df2193318fdf5a939a631249a8f4 /src/datetime.c
parentedc780c6a1406de34d111bc327ee8a534fb0d613 (diff)
downloadatsign-9375a5d47217eea328d334ece74644814d2279d1.zip
atsign-9375a5d47217eea328d334ece74644814d2279d1.tar.gz
atsign-9375a5d47217eea328d334ece74644814d2279d1.tar.bz2
datetime: Make year optional
Diffstat (limited to 'src/datetime.c')
-rw-r--r--src/datetime.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/datetime.c b/src/datetime.c
index aa46d59..4041358 100644
--- a/src/datetime.c
+++ b/src/datetime.c
@@ -39,11 +39,11 @@ datetime_parse(const char *input, time_t *arg_sec)
time_t now_sec;
struct tm *now_tm;
- arg_tm.tm_mday = INT_MIN; /* Sentinel */
- arg_tm.tm_sec = 0; /* Default */
- arg_tm.tm_isdst = -1;
-
for (i = 0; DATETIME_FMTS_[i] != NULL; ++i) {
+ arg_tm.tm_year = INT_MIN; /* Sentinel */
+ arg_tm.tm_mday = INT_MIN; /* Sentinel */
+ arg_tm.tm_sec = 0; /* Default */
+ arg_tm.tm_isdst = -1;
end = strptime(input, DATETIME_FMTS_[i], &arg_tm);
if (end != NULL && *end == '\0') {
goto found;
@@ -54,7 +54,7 @@ datetime_parse(const char *input, time_t *arg_sec)
return -1;
found:
- /* TODO: Support %a-only dates and optional years */
+ /* TODO: Support %a-only dates */
if (arg_tm.tm_mday == INT_MIN) {
/* No date specified; try today. */
now_sec = time(NULL);
@@ -75,6 +75,18 @@ 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_year == INT_MIN) {
+ /* No year specified; try this year. */
+ now_sec = time(NULL);
+ now_tm = localtime(&now_sec);
+ arg_tm.tm_year = now_tm->tm_year;
+ *arg_sec = mktime(&arg_tm);
+ if (*arg_sec <= mktime(now_tm)) {
+ /* Specified time already happened this year; use next
+ * year. */
+ ++arg_tm.tm_year;
+ *arg_sec = mktime(&arg_tm);
+ }
} else {
*arg_sec = mktime(&arg_tm);
}