ISO 8601 specifies three syntaxes for timezones other than "Z". git already supports the +-hhmm syntax. This patch adds support for the other two: +-hh:mm and +-hh. Signed-off-by: Marcus Comstedt <marcus@xxxxxxxx> --- date.c | 39 ++++++++++++++++++++++++++------------- 1 files changed, 26 insertions(+), 13 deletions(-) diff --git a/date.c b/date.c index 6bae49c..f2cad1f 100644 --- a/date.c +++ b/date.c @@ -555,21 +555,34 @@ static int match_tz(const char *date, int *offp) int min, hour; int n = end - date - 1; - min = offset % 100; - hour = offset / 100; + if (n == 2 && offset <= 14) { + /* +HH:MM (ISO 8601) or +HH (ISO 8601 abbreviated) */ + hour = offset; + if (date[3] == ':') { + min = strtoul(date + 4, &end, 10); + if (end != date + 6) { + /* there was no minute field, but we're + fine with just the hour */ + end = (char *)date + 3; + min = 0; + } + } else { + min = 0; + } + } else if (n < 3) { + return end - date; /* we want at least 3 digits */ + } else { + min = offset % 100; + hour = offset / 100; + } - /* - * Don't accept any random crap.. At least 3 digits, and - * a valid minute. We might want to check that the minutes - * are divisible by 30 or something too. - */ - if (min < 60 && n > 2) { - offset = hour*60+min; - if (*date == '-') - offset = -offset; + if (60 <= min) + return end - date; /* invalid minute */ - *offp = offset; - } + offset = hour * 60 + min; + if (*date == '-') + offset = -offset; + *offp = offset; return end - date; } -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html