use Time::Local qw( timegm_nocheck ); sub get_yesterday { my ($date) = @_; my ($year, $month, $day) = split(/-/, $date); return sprintf("%d-%02d-%02d", (gmtime(timegm_nocheck(0, 0, 0, $day-1, month, $year)))[5, 4, 3] ); }