首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过将小时添加到perl中的当前日期来计算下一个业务日期。

通过将小时添加到perl中的当前日期来计算下一个业务日期。
EN

Stack Overflow用户
提问于 2022-07-18 08:00:54
回答 1查看 116关注 0票数 2

我想现在添加一个日期,x小时,并处理这个依赖于商业日历。否则我不知道怎么解释,这样一个例子就更实用了。

我的商业日历样本是:

  • 开始时间上午9点
  • 结束时间下午6点
  • 以及各种公共假日和周末

我希望:

  • date now : 18-07-2022下午4:30
  • (加5小时
  • )我有以下结果: 19-07-2022 12:30下午4:30

当然,在公共假日处于中间的情况下,我们会跳过它(包括周末)。如果我以前面的例子为例,但对于周末而言,情况将是:

  • 开始日期: 15-07-2022 4:30下午4:30
  • 加5小时
  • 结束日期: 18-07-2022 12:30下午3:30

我已经使用了param业务日历,如下所示:

代码语言:javascript
复制
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)],
   );

或:

代码语言:javascript
复制
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)],
   );

代码语言:javascript
复制
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)],
   );

提前谢谢你的帮助。:)

EN

回答 1

Stack Overflow用户

发布于 2022-07-18 14:48:08

让我们把这段代码写下来。

代码语言:javascript
复制
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;
}

剩下的也很简单。(需要检查假期)

代码语言:javascript
复制
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)

代码语言:javascript
复制
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));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73019038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档