diff options
author | P. 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) |
commit | 9375a5d47217eea328d334ece74644814d2279d1 (patch) | |
tree | 51f9d37fe047df2193318fdf5a939a631249a8f4 /src/datetime.c | |
parent | edc780c6a1406de34d111bc327ee8a534fb0d613 (diff) | |
download | atsign-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.c | 22 |
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); } |