The difference when using "T" as seperator is 7 hours.
GNU date.c uses parse-datetime from gnulib:
https://github.com/coreutils/gnulib/blob/master/lib/parse-datetime.y
There is a definition of a
/* Military time zone table.
RFC 822 got these backwards, but RFC 5322 makes the incorrect
treatment optional, so do them the right way here.
Note 'T' is a special case, as it is used as the separator in ISO
8601 date and time of day representation. */
static table const military_table[] =
{
{ "A", tZONE, HOUR ( 1) },
{ "B", tZONE, HOUR ( 2) },
...
{ "S", tZONE, -HOUR ( 6) },
{ "T", 'T', 0 },
{ "U", tZONE, -HOUR ( 8) },
{ "V", tZONE, -HOUR ( 9) },
{ "W", tZONE, -HOUR (10) },
{ "X", tZONE, -HOUR (11) },
{ "Y", tZONE, -HOUR (12) },
{ "Z", tZONE, HOUR ( 0) },
{ NULL, 0, 0 }
};
So probably the "T" is incorrectly interpreted as a "Military time zone
offset" instead of a delimiter.