Just a remark to
I0's solution. Though very elegant this only works for values within one year.
tachyon's 'roll-your-own-method' works for arbitrary values (within integer range - this could be fixed by using
Math::BigInt). Just something to keep in mind ...
Originally posted as a Categorized Answer.