The offset in TZ for GNU date (or libc?) seemed can't be bigger than 24. You need to convert the day part into -d argument as you said. Either override your date command with a function:
function date
{
local t="${TZ%%[-0-9+]*}"
local n="${TZ#$t}"
[ -z "$t" ] && { command date "$@"; return; }
#TZ=$t$((n%24)) /bin/date -d "$((-n/24)) days" "$@"
TZ=$t$((n%24)) command date -d "$((-n/24)) days" "$@"
}
or convert all your scripts with:
awk '{
if (match($0, /TZ=[A-Z]+[-+0-9 ]+date/)) {
n = s = substr($0, RSTART, RLENGTH)
gsub(/[^-+0-9]/, "", n)
sub(n, sprintf("%+d", n%24), s)
x = sprintf("%+d days", -int(n/24))
$0 = substr($0,1,RSTART-1) s " -d \"" x "\"" substr($0,RSTART+RLENGTH)
}
print
}'