From 9375a5d47217eea328d334ece74644814d2279d1 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Sun, 29 Aug 2021 14:32:12 -0400 Subject: datetime: Make year optional --- (limited to 'src/datetime.c') 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); } -- cgit v0.9.1