【问题标题】:How do I run a script on the 1st working day of every month?如何在每个月的第一个工作日运行脚本?
【发布时间】:2010-09-27 23:21:17
【问题描述】:

我必须在每个月的第一个工作日运行一个脚本。请建议我如何在 Perl 中做到这一点。

假设如果该国家/地区是国定假日,则脚本应在第二个工作日运行。 如果特定国家/地区的假期,我有一个二进制文件,可以为我提供前一个工作日的输出。

【问题讨论】:

  • 你能扩展“前一个工作日的输出”吗?如果不是假期,它会给你什么?
  • 今天的日期,如果我在 10 月 1 日运行,输出将是“101001”即年月日
  • 你能扩展“在那个国家”吗?您对哪些国家/地区感兴趣?

标签: perl unix


【解决方案1】:

我建议您在周一至周五每天使用cron 运行一次脚本。

然后您的脚本将进行初始测试,如果测试失败则退出。

测试将是(伪代码):

if ( isWeekend( today ) ) {
    exit;
} elsif ( public_holiday( today ) ) {
    exit;
}
for ( day_of_month = 1; day_of_month < today; day_of_month++ ) {
    next if ( isWeekend( day_of_month ) );

    if ( ! public_holiday( day_of_month ) ) {
        # a valid day earlier in the month wasn't a public holiday
        # thus this script MUST have successfully run, so exit
        exit;
    }
}

# run script, because today is NOT the weekend, NOT a public holiday, and
#   no possible valid days for running exist earlier in this month
1;

例如,isWeekend 函数在 Perl 中可能如下所示:

sub isWeekend {
    my ( $epoch_time ) = @_;

    my $day_of_week = ( localtime( $epoch_time ) )[6];
    return( 1 ) if ( $day_of_week == 0 ); # Sunday
    return( 1 ) if ( $day_of_week == 6 ); # Saturday
    return( 0 );
}

您必须编写自己的 public_holiday 函数来返回真值,具体取决于日期是否为您所在州/国家/地区的公共假日。

【讨论】:

  • 但是让我们说星期一既不是假期也不是周末,它运行了..但是如何防止在星期二运行。
  • 它不会在星期二运行,因为上面的代码会检测到星期一是有效的一天然后退出。阅读上面的伪代码。
【解决方案2】:

CPAN 包Date::Manip 有各种好东西来支持这种事情。 'Date_NextWorkDay()' 似乎最适合您。

【讨论】:

    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多