我想现在添加一个日期,x小时,并处理这个依赖于商业日历。否则我不知道怎么解释,这样一个例子就更实用了。
我的商业日历样本是:
我希望:
当然,在公共假日处于中间的情况下,我们会跳过它(包括周末)。如果我以前面的例子为例,但对于周末而言,情况将是:
我已经使用了param业务日历,如下所示:
my %sansSLA = (
1 => { Name => 'Monday',
Start => '8:00',
End => '18:00'},
2 => { Name => 'Tuesday',
Start => '8:00',
End => '18:00'},
3 => { Name => 'Wednesday',
Start => '8:00',
End => '18:00'},
4 => { Name => 'Thursday',
Start => '8:00',
End => '18:00'},
5 => { Name => 'Friday',
Start => '8:00',
End => '18:00'},
6 => { Name => 'Saturday',
Start => undef,
End => undef},
0 => { Name => 'Sunday',
Start => undef,
End => undef},
holidays => [qw(01-01 05-01 05-08 07-14 08-15 11-11 12-25 2022-05-18 2022-05-26 2023-0410 2023-04-10 2023-05-18 2024-04-01 2024-05-09 2025-04-21 2025-05-29 2026-04-06 2026-05-14 2027-03-29 2027-05-06 2028-04-17 2028-05-25 2029-04-02 2029-05-10 2030-04-22 2030-05-30)],
);或:
my %sla8_18 = (
1 => { Name => 'Monday',
Start => '8:00',
End => '18:00'},
2 => { Name => 'Tuesday',
Start => '8:00',
End => '18:00'},
3 => { Name => 'Wednesday',
Start => '8:00',
End => '18:00'},
4 => { Name => 'Thursday',
Start => '8:00',
End => '18:00'},
5 => { Name => 'Friday',
Start => '8:00',
End => '18:00'},
6 => { Name => 'Saturday',
Start => '8:00',
End => '18:00'},
0 => { Name => 'Sunday',
Start => undef,
End => undef},
holidays => [qw(01-01 05-01 05-08 07-14 08-15 11-11 12-25 2022-05-18 2022-05-26 2023-0410 2023-04-10 2023-05-18 2024-04-01 2024-05-09 2025-04-21 2025-05-29 2026-04-06 2026-05-14 2027-03-29 2027-05-06 2028-04-17 2028-05-25 2029-04-02 2029-05-10 2030-04-22 2030-05-30)],
);和
my %slaMax = (
1 => { Name => 'Monday',
Start => '00:00',
End => '23:59'},
2 => { Name => 'Tuesday',
Start => '00:00',
End => '23:59'},
3 => { Name => 'Wednesday',
Start => '00:00',
End => '23:59'},
4 => { Name => 'Thursday',
Start => '00:00',
End => '23:59'},
5 => { Name => 'Friday',
Start => '00:00',
End => '23:59'},
6 => { Name => 'Saturday',
Start => '00:00',
End => '23:59'},
0 => { Name => 'Sunday',
Start => '00:00',
End => '23:59'},
#holidays => [qw(01-01 05-01 05-08 07-14 08-15 11-11 12-25 2022-05-18 2022-05-26 2023-0410 2023-04-10 2023-05-18 2024-04-01 2024-05-09 2025-04-21 2025-05-29 2026-04-06 2026-05-14 2027-03-29 2027-05-06 2028-04-17 2028-05-25 2029-04-02 2029-05-10 2030-04-22 2030-05-30)],
);提前谢谢你的帮助。:)
发布于 2022-07-18 14:48:08
让我们把这段代码写下来。
sub add_time {
my $time = shift; #Assuming timestamp in seconds
my $add = shift; #assuming seconds
while ( $add > 0 ) {
my $day = get_day_record($time);
my $time_in_day_available = time_in_day ($time, $day);
if ($add > $time_in_day_available) {
$add = $add - $time_in_day_available;
$time = get_timestamp_of_next_day($time);
} else {
$time = start_time_of_day ($time, $day) + $add;
$add = 0;
}
}
return $time;
}剩下的也很简单。(需要检查假期)
sub get_day_record {
my $time = shift;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime($time);
if (check_for_holidays($time)) {
return { Name => 'holiday',
Start => undef,
End => undef}
} else {
return $sansSLA{$wday};
}
}
sub check_for_holidays {
return ;
}
sub time_in_day {
my $time = shift ;
my $day = shift;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime($time);
return 0
unless $day->{Start};
my ($end_hour, $end_min) = split(':', $day->{End});
my $end_work_time = timelocal(0,$end_min,$end_hour,$mday,$mon,$year);
return 0
if $end_work_time < $time;
my $start_work_time = start_time_of_day ($time, $day);
return $end_work_time - $start_work_time;
}
sub start_time_of_day {
my $time = shift ;
my $day = shift;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime($time);
my ($start_hour, $start_min) = split(':', $day->{Start});
my $start_work_time = timelocal(0,$start_min,$start_hour,$mday,$mon,$year);
return $time
if $start_work_time < $time;
return $start_work_time;
}
sub get_timestamp_of_next_day {
my $time = shift;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime($time);
return timelocal_nocheck(0,0,0,$mday+1,$mon,$year);
} 并在单个脚本中测试整个过程(包括使用必要的时间::Local)
use strict;
use warnings;
use Time::Local qw(timelocal timelocal_nocheck);
my %sansSLA = (
1 => { Name => 'Monday',
Start => '8:00',
End => '18:00'},
2 => { Name => 'Tuesday',
Start => '8:00',
End => '18:00'},
3 => { Name => 'Wednesday',
Start => '8:00',
End => '18:00'},
4 => { Name => 'Thursday',
Start => '8:00',
End => '18:00'},
5 => { Name => 'Friday',
Start => '8:00',
End => '18:00'},
6 => { Name => 'Saturday',
Start => undef,
End => undef},
0 => { Name => 'Sunday',
Start => undef,
End => undef},
holidays => [qw(01-01 05-01 05-08 07-14 08-15 11-11 12-25 2022-05-18 2022-05-26 2023-0410 2023-04-10 2023-05-18 2024-04-01 2024-05-09 2025-04-21 2025-05-29 2026-04-06 2026-05-14 2027-03-29 2027-05-06 2028-04-17 2028-05-25 2029-04-02 2029-05-10 2030-04-22 2030-05-30)],
);
my $start = timelocal (0,0,0,18,06,122); # this is the 18 07 2022
print scalar localtime(add_time($start, 52*60*60));https://stackoverflow.com/questions/73019038
复制相似问题