计算复活节日期(PERL)的好方法

时间:2017-03-07 11:34:47

标签: perl

如何计算特定国家/地区的正确假日日期,在这种情况下是瑞典? 我知道如何获得星期六和星期日,并将它们排除在处理之外。

但是其他假期,如圣诞节,国庆节,基督天空旅行日,十三天,这些都是红日,需要在出勤解决方案中排除。

我想知道的是,如果某个特定年份,月份和日期,我将如何执行某项功能,如果是假期,将返回真或假。

我查看了Date :: Holidays但是没有瑞典的数据源,它说我需要自己创建一个。但问题是更多,我如何计算正确的日期?是否有特定的算法来获取假日日期,例如复活节?

有些假日日期很容易从列表中创建,例如每年有固定日期的圣诞节晚会和新年,但每年的假期都不同。

例如,这非常复杂:

复活节:在春分之后的第一次ecklesaustic满月之后的第一个星期天。

大多数其他动态假期都是在复活节之外计算的。

1 个答案:

答案 0 :(得分:2)

这是我用它创建的函数。它希望将一年作为参数,并将返回当年瑞典所有红色日(非工作日)的哈希值。

请注意,它不会返回任何星期六或星期日的假期,因为星期六和星期日是非商业性的。

Requires Date::Calc and Date::Easter

    sub GetHoliDayList() {

    $yeartocheck = $_[0];

    $holiday{'1-1'} = '1';
    $holiday{'1-6'} = '1';
    $holiday{'5-1'} = '1';
    $holiday{'6-6'} = '1';
    $holiday{'6-24'} = '1';
    $holiday{'12-24'} = '1';
    $holiday{'12-25'} = '1';
    $holiday{'12-26'} = '1';
    $holiday{'12-31'} = '1';

    ($eastermonth, $easterday) = gregorian_easter( $yeartocheck );
    $hea = int($eastermonth)."-".int(int($easterday) - 2);
    $heb = int($eastermonth)."-".int(int($easterday) + 1);
    $holiday{$hea} = '1';
    $holiday{$heb} = '1';

    ($year,$christskytravellermonth,$christskytravellerday) = Add_Delta_YMD($yeartocheck,$eastermonth,$easterday, 0,0,39);
    $chstv = int($christskytravellermonth)."-".int($christskytravellerday);
    $holiday{$chstv} = '1';

    if (Day_of_Week($yeartocheck,6,19) == 5) {
    $holiday{'6-19'} = '1';
    }
    if (Day_of_Week($yeartocheck,6,20) == 5) {
    $holiday{'6-20'} = '1';
    }
    if (Day_of_Week($yeartocheck,6,21) == 5) {
    $holiday{'6-21'} = '1';
    }
    if (Day_of_Week($yeartocheck,6,22) == 5) {
    $holiday{'6-22'} = '1';
    }
    if (Day_of_Week($yeartocheck,6,23) == 5) {
    $holiday{'6-23'} = '1';
    }
    if (Day_of_Week($yeartocheck,6,24) == 5) {
    $holiday{'6-24'} = '1';
    }
    if (Day_of_Week($yeartocheck,6,25) == 5) {
    $holiday{'6-25'} = '1';
    }

    return %holiday;
    }