Это не будет обрабатывать праздники (и вы должны действительно думать о них), но это минимальная реализация в Perl:
use strict;
use warnings;
use POSIX ();
my $date_string = '20100802';
my ( $year, $month, $day ) = unpack 'A4 A2 A2', $date_string;
my $today = POSIX::mktime( 0, 0, 0, $day, $month - 1, $year - 1900 );
( $day, $month, $year, my $wday ) = ( localtime $today )[3..6];
my $day_back
= POSIX::mktime( 0, 0, 0, $day - ( $wday == 1 ? 3 : 1 ), $month, $year )
;
my $day_str = POSIX::strftime( '%Y%m%d', localtime( $day_back ));
Где $time
- это заданное значение времени.