use Time::Local qw( timelocal_nocheck ); my ($day, $month, $year); my $now = time; ($day, $month, $year) = (localtime($now))[3, 4, 5]; $month -= 6; my $new_time = timelocal_nocheck(0, 0, 0, ,$day, $month, $year); ($day, $month, $year) = (localtime($new_time))[3, 4, 5]; printf("%04d-%02d-%02d\n", $year, $month, $day);