Re: [PATCH 2/2] date.c: allow compact version of ISO-8601 datetime
- From
Jeff King <peff@peff.net>
- Date
- Apr 14, 2020, 20:24 UTC
- Message-ID
- <20200414202401.GC1879688@coredump.intra.peff.net>
- In-Reply-To
- <06e62c58d5accad7bbebbc51f9fb38fda83a73f6.1586856398.git.congdanhqx@gmail.com>
On Tue, Apr 14, 2020 at 04:31:55PM +0700, Đoàn Trần Công Danh wrote:
Show 11 quoted lines
> @@ -666,6 +666,24 @@ static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt
> n++;
> } while (isdigit(date[n]));
>
> + /* 8 digits, compact style of ISO-8601's date: YYYYmmDD */
> + if (n == 8) {
> + tm->tm_year = num / 10000 - 1900;
> + tm->tm_mon = (num % 10000) / 100 - 1;
> + tm->tm_mday = num % 100;
> + return n;
> + }I worry a little this may conflict with other approxidate heuristics. The only one I can think of is an actual unix timestamp, though, and we already require that to have at least 9 digits (plus anybody wanting to use one robustly really should be using @12345678).
And it looks like we'd exit early from the function for anything longer than 4 digits anyway, ignoring the value.
We could probably tighten the heuristics a bit by insisting that the month and day be sensible. Or even year (see the 1900 to 2100 magic for the 4-digit year guess).
Show 9 quoted lines
> + /* 6 digits, compact style of ISO-8601's time: HHMMSS */
> + if (n == 6) {
> + tm->tm_hour = num / 10000;
> + tm->tm_min = (num % 10000) / 100;
> + tm->tm_sec = num % 100;
> + if (*end == '.' && isdigit(end[1]))
> + strtoul(end + 1, &end, 10);
> + return end - date;
> + }And likewise here that the hour, minute, and second be reasonable.
-Peff