Creating recurring date patterns using Perl
This program will be helpful if someone want to create recur date patterns based on criteria (yearly, monthly,weekly and daily). Program is written in Perl using old version of Date::Manip CPAN module.
# Script to calculate recurrence dates based on given criteria using Perl Date::Manip module.
# All the input dates in this are given hard coded. These shall be passed through external program etc.
#!/usr/local/bin/perl -w
use strict;
use Date::Manip;
use Data::Dumper;
# calculate the dates for yearly patterns.
&yearly();
&monthly();
&weekly();
&daily();
sub yearly {
my $base = "2015-10-29";
my $start_date = "2015-10-29";
my $end_date = "2018-01-01";
my $yearly_recur_every ="1";
my $yearly_on_month = "10";
my $yearly_on_week = "0";
my $yearly_on_day = "29";
my $yearly_on_the_month = "10";
my $yearly_on_the_week = "1";
my $yearly_on_the_day = "1";
my $frequency = "";
my $frequency_pattern_yearly_on = "$yearly_recur_every*$yearly_on_month:$yearly_on_week:$yearly_on_day:0:0:0";
my $frequency_pattern_yearly_on_the = "$yearly_recur_every*$yearly_on_the_month:$yearly_on_the_week:$yearly_on_the_day:0:0:0";
my @yearly_dates_on = ParseRecur($frequency_pattern_yearly_on,$base,$start_date,$end_date); # On a certain day of a month
my @yearly_dates_on_the = ParseRecur($frequency_pattern_yearly_on_the,$base,$start_date,$end_date); # First Monday of Oct
print "\n";
print "******************************************************************************\n";
print "**************************** YEARLY *******************************************\n";
print "*******************************************************************************\n";
print "Start date :". $start_date."\n";
print "End date :". $end_date."\n";
print "\n";
print "******************************************************************************\n";
print "Temporal expression: every 1 year on October 29\n";
print "Rule: ".$frequency_pattern_yearly_on;
print "\n";
print "Dates:\n";
print Dumper (\@yearly_dates_on);
print "\n";
print "Temporal expression: every 1 year on the first Monday of October\n";
print "Rule: ".$frequency_pattern_yearly_on_the;
print "\n";
print "Dates:\n";
print Dumper (\@yearly_dates_on_the);
print "\n";
}
# Monthly
sub monthly () {
my $base = "2015-10-29";
my $start_date = "2016-01-22";
my $end_date = "2017-06-01";
my $monthly_recur_every ="1";
my $monthly_day_of = "29";
my $monthly_the_day = "1";
my $monthly_the_week = "1";
my $frequency = "";
my $frequency_pattern_monthly_day = "0:$monthly_recur_every*0:$monthly_day_of:0:0:0";
my $frequency_pattern_monthly_the_day ="0:1*-2:5:0:0:0"; # Every month on the 2nd last Friday
my @monthly_dates_day = ParseRecur($frequency_pattern_monthly_day,$base,$start_date,$end_date); # On a certain day of a month
my @monthly_dates_the_day = ParseRecur($frequency_pattern_monthly_the_day,$base,$start_date,$end_date); # First Monday of Oct
print "\n";
print "******************************************************************************\n";
print "**************************** MONTHLY *******************************************\n";
print "*******************************************************************************\n";
print "Start date :". $start_date."\n";
print "End date :". $end_date."\n";
print "\n";
print "******************************************************************************\n";
print "Temporal expression: Day 29 of every 1 month\n";
print "Rule: ".$frequency_pattern_monthly_day;
print "\n";
print "Dates:\n";
print Dumper (\@monthly_dates_day);
print "\n";
print "Temporal expression: The first monday of every month\n";
print "Rule: ".$frequency_pattern_monthly_the_day;
print "\n";
print "Dates:\n";
print Dumper (\@monthly_dates_the_day);
print "\n";
}
# Weekly
sub weekly () {
my $base = "2015-10-29";
my $start_date = "2016-01-22";
my $end_date = "2016-03-01";
my $weekly_recur_every ="1";
# We need to add comma on the value we are getting from UI .. if the field is not selected means no value then
# no comma will be added
my $first_day_of_the_week = ""; # Monday
my $second_day_of_the_week = "2,"; # Tuesday
my $third_day_of_the_week = ""; # Wednesday
my $fourth_day_of_the_week = "4,"; #Thrusday
my $fifth_day_of_the_week = ""; # Friday
my $sixth_day_of_the_week = ""; # Saturday
my $seventh_day_of_the_week = ""; # Sunday
# my $weekly_the_day = "1";
# my $weekly_the_week = "1";
my $frequency = "";
my $frequency_pattern_weekly_day = "0:0:$weekly_recur_every*$first_day_of_the_week$second_day_of_the_week$third_day_of_the_week$fourth_day_of_the_week$fifth_day_of_the_week$sixth_day_of_the_week$seventh_day_of_the_week:0:0:0";
my @weekly_dates_day = ParseRecur($frequency_pattern_weekly_day,$base,$start_date,$end_date); # On a certain day of a month
print "\n";
print "******************************************************************************\n";
print "**************************** WEEKLY *******************************************\n";
print "*******************************************************************************\n";
print "Start date :". $start_date."\n";
print "End date :". $end_date."\n";
print "\n";
print "Temporal expression: Every every week on Tuesday and Thrusday\n";
print "Rule: ".$frequency_pattern_weekly_day;
print "\n";
print "Dates:\n";
print Dumper (\@weekly_dates_day);
print "\n";
}
# Daily
sub daily () {
my $base = "2015-10-29";
my $start_date = "2016-01-22";
my $end_date = "2016-02-05";
my $daily_recur_everyday ="1";
# We need to add comma on the value we are getting from UI .. if the field is not selected means no value then
# no comma will be added
my $first_day_of_the_weekday = "1,"; # Monday
my $second_day_of_the_weekday = "2,"; # Tuesday
my $third_day_of_the_weekday = "3,"; # Wednesday
my $fourth_day_of_the_weekday = "4,"; #Thrusday
my $fifth_day_of_the_weekday = "5"; # Friday
my $daily_start_time = "8:00"; # 8AM
my $frequency = "";
my $frequency_pattern_daily_everyday = "0:0:0:$daily_recur_everyday*0:0:0";
# 0:1*1-5:$dow:0:0:0";
# "0:0:0:$n*0:0:0"; # Every nth day
my $frequency_pattern_daily_every_weekday = "0:0:$daily_recur_everyday*$first_day_of_the_weekday$second_day_of_the_weekday$third_day_of_the_weekday$fourth_day_of_the_weekday$fifth_day_of_the_weekday:0:0:0";
my @daily_dates_everyday = ParseRecur($frequency_pattern_daily_everyday,$base,$start_date,$end_date); # On a certain day of a month
my @daily_dates_every_weekday = ParseRecur($frequency_pattern_daily_every_weekday,$base,$start_date,$end_date); # On a certain day of a month
print "\n";
print "******************************************************************************\n";
print "**************************** DAILY *******************************************\n";
print "******************************************************************************\n";
print "Start date: ". $start_date."\n";
print "End date: ". $end_date."\n";
print "\n";
print "Temporal expression: Everyday\n";
print "Rule: ".$frequency_pattern_daily_everyday;
print "\n";
print "Dates:".@daily_dates_everyday."\n";
print Dumper (\@daily_dates_everyday);
print "\n";
print "Temporal expression: Every weekday\n";
print "Rule: ".$frequency_pattern_daily_every_weekday;
print "\n";
print "Dates:\n";
print Dumper (\@daily_dates_every_weekday);
print "\n";
}
# End of script
Full working code is available on GitHub with documentation.
Enjoy,