Here's one without any module required. (Mainly for fun.) Take the current time. Find the day of the week. Then subtract 12 hours at a time while you're still on that day or you're on a weekend (day = 0 or 6 -- so abs(3-day) == 3). I think you avoid any Daylight Saving problems by going 12 hours at a time. (Going 24 hours at a time could skip the 23-hour day.) Someone correct me if that's wrong.
my $t = time;
my $dow = (localtime $t)[6];
my $new_dow;
do {
$t -= 43200; # half a day, to counter Daylight Saving effects
$new_dow = (localtime $t)[6];
} while $dow == $new_dow or 3 == abs(3-$new_dow);
my @ymd = (localtime $t)[5,4,3];
$ymd[0]+=1900;
$ymd[1]++;
my $date = sprintf "%04d-%02d-%02d", @ymd;