Time::Fuzzy may do what you want. And, you can always alternate it's use with strftime to meet your fourth point.
--- echo S 1 [ Y V U | perl -ane 'print reverse map { $_ = chr(ord($_)-1) } @F;' Warning: Any code posted by tuxz0r is untested, unless otherwise stated, and is used at your own risk.