About time decoding
Time decoding is not bit rotating (by 4), but you can use
[(e&0xf)*10+(e>>4) for e in data[1:8]]
Please see this multiplication by 10.
TZ decoding must be done before time decoding. So,
tz='+' if data[7]&0x08: tz='-' data[7]&=0xf7
Except these points, this problem was indeed fun. ^^