line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
{ |
2
|
|
|
|
|
|
|
package Date::Components; |
3
|
|
|
|
|
|
|
|
4
|
46
|
|
|
46
|
|
1534296
|
use 5.008008; |
|
46
|
|
|
|
|
186
|
|
|
46
|
|
|
|
|
3641
|
|
5
|
46
|
|
|
46
|
|
280
|
use strict; |
|
46
|
|
|
|
|
100
|
|
|
46
|
|
|
|
|
2133
|
|
6
|
46
|
|
|
46
|
|
318
|
use warnings; |
|
46
|
|
|
|
|
115
|
|
|
46
|
|
|
|
|
4286
|
|
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
require Exporter; |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
our @ISA = qw(Exporter); |
11
|
|
|
|
|
|
|
|
12
|
46
|
|
|
46
|
|
289
|
eval {use Carp qw(croak)}; |
|
46
|
|
|
|
|
109
|
|
|
46
|
|
|
|
|
5062
|
|
13
|
46
|
|
|
46
|
|
58275
|
eval {use Readonly}; |
|
46
|
|
|
|
|
198007
|
|
|
46
|
|
|
|
|
25721
|
|
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
our @EXPORT = qw(); |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
# Items to export into callers namespace by default. Note: do not export |
18
|
|
|
|
|
|
|
# names by default without a very good reason. Use EXPORT_OK instead. |
19
|
|
|
|
|
|
|
# Do not simply export all your public functions/methods/constants. |
20
|
|
|
|
|
|
|
our @EXPORT_OK = ( qw( |
21
|
|
|
|
|
|
|
date_only_parse |
22
|
|
|
|
|
|
|
is_valid_date |
23
|
|
|
|
|
|
|
format_date |
24
|
|
|
|
|
|
|
is_leap_year |
25
|
|
|
|
|
|
|
is_valid_month |
26
|
|
|
|
|
|
|
is_valid_day_of_month |
27
|
|
|
|
|
|
|
is_valid_day_of_week |
28
|
|
|
|
|
|
|
is_valid_year |
29
|
|
|
|
|
|
|
is_valid_400_year_cycle |
30
|
|
|
|
|
|
|
get_year_phase |
31
|
|
|
|
|
|
|
number_of_day_within_year |
32
|
|
|
|
|
|
|
day_number_within_year_to_date |
33
|
|
|
|
|
|
|
day_number_within_400_year_cycle_to_date |
34
|
|
|
|
|
|
|
get_number_of_day_within_400yr_cycle |
35
|
|
|
|
|
|
|
get_days_remaining_in_400yr_cycle |
36
|
|
|
|
|
|
|
day_name_to_day_number |
37
|
|
|
|
|
|
|
day_number_to_day_name |
38
|
|
|
|
|
|
|
get_num_days_in_year |
39
|
|
|
|
|
|
|
get_days_remaining_in_year |
40
|
|
|
|
|
|
|
get_numeric_day_of_week |
41
|
|
|
|
|
|
|
get_month_from_string |
42
|
|
|
|
|
|
|
get_dayofmonth_from_string |
43
|
|
|
|
|
|
|
get_year_from_string |
44
|
|
|
|
|
|
|
get_number_of_days_in_month |
45
|
|
|
|
|
|
|
get_days_remaining_in_month |
46
|
|
|
|
|
|
|
get_first_of_month_day_of_week |
47
|
|
|
|
|
|
|
month_name_to_month_number |
48
|
|
|
|
|
|
|
month_number_to_month_name |
49
|
|
|
|
|
|
|
set_day_to_day_name_abbrev |
50
|
|
|
|
|
|
|
set_day_to_day_name_full |
51
|
|
|
|
|
|
|
set_day_to_day_number |
52
|
|
|
|
|
|
|
set_month_to_month_name_abbrev |
53
|
|
|
|
|
|
|
set_month_to_month_name_full |
54
|
|
|
|
|
|
|
set_month_to_month_number |
55
|
|
|
|
|
|
|
date1_to_date2_delta |
56
|
|
|
|
|
|
|
number_of_weekdays_in_range |
57
|
|
|
|
|
|
|
compare_date1_and_date2 |
58
|
|
|
|
|
|
|
year1_to_year2_delta |
59
|
|
|
|
|
|
|
compare_year1_and_year2 |
60
|
|
|
|
|
|
|
date_offset_in_days |
61
|
|
|
|
|
|
|
date_offset_in_weekdays |
62
|
|
|
|
|
|
|
date_offset_in_years |
63
|
|
|
|
|
|
|
calculate_day_of_week_for_first_of_month_in_next_year |
64
|
|
|
|
|
|
|
get_global_year_cycle |
65
|
|
|
|
|
|
|
), |
66
|
|
|
|
|
|
|
); |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
# This allows declaration use Date::Components ':all'; |
69
|
|
|
|
|
|
|
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK |
70
|
|
|
|
|
|
|
# will save memory. |
71
|
|
|
|
|
|
|
our %EXPORT_TAGS = ( |
72
|
|
|
|
|
|
|
'all' => [ @EXPORT_OK, @EXPORT ], |
73
|
|
|
|
|
|
|
); |
74
|
|
|
|
|
|
|
|
75
|
46
|
|
|
46
|
|
52311
|
use version; our $VERSION = qv('0.2.1'); |
|
46
|
|
|
|
|
133128
|
|
|
46
|
|
|
|
|
406
|
|
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
# According to the Royal Greenwich Observatory, the calendar year is 365 days |
79
|
|
|
|
|
|
|
# long, unless the year is exactly divisible by four, then an extra day is |
80
|
|
|
|
|
|
|
# added to February so the year is 366 days long. If the year is the last year |
81
|
|
|
|
|
|
|
# of a century, e.g., 2000, 2100, 2200, 2300, 2400, then it is only a leap |
82
|
|
|
|
|
|
|
# year if it is exactly divisible by 400. So, 2100 won't be a leap year but |
83
|
|
|
|
|
|
|
# 2000 is. The next century year, exactly divisible by 400, won't occur until |
84
|
|
|
|
|
|
|
# 2400--400 years away. |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
Readonly my $DATE_BASELINE_YEAR_2000 => '2000'; |
93
|
|
|
|
|
|
|
#Readonly my $DATE_BASELINE_MONTHNUM => '1'; |
94
|
|
|
|
|
|
|
#Readonly my $DATE_BASELINE_MONTHNAME => 'January'; |
95
|
|
|
|
|
|
|
#Readonly my $DATE_BASELINE_DAYNUM => '6'; |
96
|
|
|
|
|
|
|
#Readonly my $DATE_BASELINE_DAYNAME => 'Saturday'; |
97
|
|
|
|
|
|
|
Readonly my $NUMBER_OF_YEAR_PHASES => 400; |
98
|
|
|
|
|
|
|
#Readonly my $MIN_NUMBER_OF_DAYS_IN_YEAR => 365; |
99
|
|
|
|
|
|
|
#Readonly my $MAX_NUMBER_OF_DAYS_IN_YEAR => 366; |
100
|
|
|
|
|
|
|
#Readonly my $MIN_NUMBER_OF_DAYS_IN_A_MONTH => 28; |
101
|
|
|
|
|
|
|
#Readonly my $NUMBER_OF_MONTHS_IN_YEAR => 12; |
102
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
Readonly my $NUMBER_OF_DAYS_IN_400_YEAR_CYCLE => (300 * 365) + (100 * 366) - 3; # three is subtracted for the three of the four century years which are NOT leap years |
104
|
|
|
|
|
|
|
Readonly my $BASELINE_DAY_OF_WEEK_ON_JAN_1_2000 => 6; |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
# Create READ ONLY hash to hold day of week on Jan 1 for each year phase |
109
|
|
|
|
|
|
|
my %hash_intermediate_00; |
110
|
|
|
|
|
|
|
$hash_intermediate_00{'0'} = $BASELINE_DAY_OF_WEEK_ON_JAN_1_2000; |
111
|
|
|
|
|
|
|
for ( my $iii_003=1; $iii_003<$NUMBER_OF_YEAR_PHASES; $iii_003++ ) |
112
|
|
|
|
|
|
|
{ |
113
|
|
|
|
|
|
|
my $num_days_in_year_05 = get_num_days_in_year($iii_003 - 1); |
114
|
|
|
|
|
|
|
$hash_intermediate_00{$iii_003} = calculate_day_of_week_for_first_of_month_in_next_year( $num_days_in_year_05, $hash_intermediate_00{$iii_003 - 1} ); |
115
|
|
|
|
|
|
|
} |
116
|
|
|
|
|
|
|
Readonly my %DAY_OF_WEEK_ON_FIRST_OF_YEAR => %hash_intermediate_00; |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
# Create READ ONLY hash to hold day of week on each first of month for each year phase |
120
|
|
|
|
|
|
|
my %hash_intermediate_01; |
121
|
|
|
|
|
|
|
for ( my $iii_007=0; $iii_007<$NUMBER_OF_YEAR_PHASES; $iii_007++ ) |
122
|
|
|
|
|
|
|
{ |
123
|
|
|
|
|
|
|
$hash_intermediate_01{$iii_007}{1} = get_first_of_month_day_of_week( 1, $iii_007 ); |
124
|
|
|
|
|
|
|
$hash_intermediate_01{$iii_007}{2} = get_first_of_month_day_of_week( 2, $iii_007 ); |
125
|
|
|
|
|
|
|
$hash_intermediate_01{$iii_007}{3} = get_first_of_month_day_of_week( 3, $iii_007 ); |
126
|
|
|
|
|
|
|
$hash_intermediate_01{$iii_007}{4} = get_first_of_month_day_of_week( 4, $iii_007 ); |
127
|
|
|
|
|
|
|
$hash_intermediate_01{$iii_007}{5} = get_first_of_month_day_of_week( 5, $iii_007 ); |
128
|
|
|
|
|
|
|
$hash_intermediate_01{$iii_007}{6} = get_first_of_month_day_of_week( 6, $iii_007 ); |
129
|
|
|
|
|
|
|
$hash_intermediate_01{$iii_007}{7} = get_first_of_month_day_of_week( 7, $iii_007 ); |
130
|
|
|
|
|
|
|
$hash_intermediate_01{$iii_007}{8} = get_first_of_month_day_of_week( 8, $iii_007 ); |
131
|
|
|
|
|
|
|
$hash_intermediate_01{$iii_007}{9} = get_first_of_month_day_of_week( 9, $iii_007 ); |
132
|
|
|
|
|
|
|
$hash_intermediate_01{$iii_007}{10} = get_first_of_month_day_of_week( 10, $iii_007 ); |
133
|
|
|
|
|
|
|
$hash_intermediate_01{$iii_007}{11} = get_first_of_month_day_of_week( 11, $iii_007 ); |
134
|
|
|
|
|
|
|
$hash_intermediate_01{$iii_007}{12} = get_first_of_month_day_of_week( 12, $iii_007 ); |
135
|
|
|
|
|
|
|
} |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
Readonly my %NUMERIC_DAY_OF_WEEK_ON_FIRST_OF_MONTH => %hash_intermediate_01; |
138
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
# Preloaded methods go here. |
141
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
############################################################################### |
143
|
|
|
|
|
|
|
# Usage : date_only_parse( SCALAR ) |
144
|
|
|
|
|
|
|
# Purpose : converts variety of date strings into components for processing |
145
|
|
|
|
|
|
|
# Returns : - if parse is successful it returns a list: |
146
|
|
|
|
|
|
|
# : ( |
147
|
|
|
|
|
|
|
# : month_integer<1-12>, |
148
|
|
|
|
|
|
|
# : day_of_month_integer<1-N>, |
149
|
|
|
|
|
|
|
# : year_integer, |
150
|
|
|
|
|
|
|
# : numeric_day_of_week<1 for Mon ... 7 for Sun> |
151
|
|
|
|
|
|
|
# : ) |
152
|
|
|
|
|
|
|
# : - '' otherwise |
153
|
|
|
|
|
|
|
# Parameters : text string containing date in various formats |
154
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
155
|
|
|
|
|
|
|
# Comments : Handles all years, even negative years (aka BC) |
156
|
|
|
|
|
|
|
# : Formats Parsed |
157
|
|
|
|
|
|
|
# : - 'month_num/day_num/year' |
158
|
|
|
|
|
|
|
# : - 'Mon Sep 17 08:50:51 2007' |
159
|
|
|
|
|
|
|
# : - 'September 17, 2007' |
160
|
|
|
|
|
|
|
# : - '17 September, 2007' |
161
|
|
|
|
|
|
|
# : - 'YYYY-MM-DD' (ex: 2007-09-01 ) |
162
|
|
|
|
|
|
|
# See Also : N/A |
163
|
|
|
|
|
|
|
############################################################################### |
164
|
|
|
|
|
|
|
sub date_only_parse |
165
|
|
|
|
|
|
|
{ |
166
|
|
|
|
|
|
|
my ( |
167
|
7509
|
|
|
7509
|
1
|
39970
|
$date_string_in_00, |
168
|
|
|
|
|
|
|
) |
169
|
|
|
|
|
|
|
= @_; |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
# Incoming Inspection |
173
|
7509
|
|
|
|
|
9907
|
my $num_input_params_03 = 1; |
174
|
7509
|
100
|
|
|
|
20287
|
( @_ == $num_input_params_03 ) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_03 parameter(s), a date string in any format. '@_'.\n\n\n"; |
|
2
|
|
|
|
|
250
|
|
175
|
7507
|
100
|
|
|
|
21489
|
( ref(\$_[0]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the date string '$_[0]'.\n\n\n"; |
|
2
|
|
|
|
|
272
|
|
176
|
7505
|
100
|
|
|
|
18214
|
( $_[0] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the date string '$_[0]'.\n\n\n"; |
|
1
|
|
|
|
|
231
|
|
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
|
179
|
7504
|
|
|
|
|
14785
|
foreach ($date_string_in_00) |
180
|
|
|
|
|
|
|
{ |
181
|
|
|
|
|
|
|
SWITCH: |
182
|
|
|
|
|
|
|
{ |
183
|
7504
|
100
|
100
|
|
|
9231
|
if ( ( /^(\d{1,2})\/(\d{1,2})\/(\-{0,1}\d{1,})$/ ) && ( is_valid_date( $1, $2, $3 ) ) ) { return ( int($1), int($2), $3, get_numeric_day_of_week( $1, $2, $3 ) ); last SWITCH; } # 'month_num/day_num/year' |
|
7504
|
|
|
|
|
58025
|
|
|
6821
|
|
|
|
|
31206
|
|
|
0
|
|
|
|
|
0
|
|
184
|
683
|
100
|
100
|
|
|
4809
|
if ( ( /^([a-z]{3,3})\s+([a-z]{3,3})\s+(\d{1,2})\s+\d\d:\d\d:\d\d\s+(\-{0,1}\d{1,})$/i ) && ( is_valid_date( $2, $3, $4, $1 ) ) ) { return ( set_month_to_month_number($2), $3, $4, get_numeric_day_of_week( $2, $3, $4 ) ); last SWITCH; } # 'Mon Sep 17 08:50:51 2007' |
|
582
|
|
|
|
|
1399
|
|
|
0
|
|
|
|
|
0
|
|
185
|
101
|
100
|
100
|
|
|
533
|
if ( ( /^([a-z]{3,})\s+(\d{1,2}),\s+(\-{0,1}\d{1,})$/i ) && ( is_valid_date( $1, $2, $3 ) ) ) { return ( set_month_to_month_number($1), $2, $3, get_numeric_day_of_week( $1, $2, $3 ) ); last SWITCH; } # 'September 17, 2007' |
|
18
|
|
|
|
|
46
|
|
|
0
|
|
|
|
|
0
|
|
186
|
83
|
100
|
100
|
|
|
380
|
if ( ( /^(\d{1,2})\s+([a-z]{3,}),\s+(\-{0,1}\d{1,})$/i ) && ( is_valid_date( $2, $1, $3 ) ) ) { return ( set_month_to_month_number($2), $1, $3, get_numeric_day_of_week( $2, $1, $3 ) ); last SWITCH; } # '17 September, 2007' |
|
13
|
|
|
|
|
42
|
|
|
0
|
|
|
|
|
0
|
|
187
|
70
|
100
|
100
|
|
|
327
|
if ( ( /^(\-{0,1}\d{1,})\-(\d{2,2})\-(\d{2,2})$/ ) && ( is_valid_date( $2, $3, $1 ) ) ) { return ( int($2), int($3), $1, get_numeric_day_of_week( $2, $3, $1 ) ); last SWITCH; } # YYYY-MM-DD (ex: 2007-09-01 ) |
|
8
|
|
|
|
|
38
|
|
|
0
|
|
|
|
|
0
|
|
188
|
|
|
|
|
|
|
# if ( ) { $whatever = 1; last SWITCH; } |
189
|
62
|
|
|
|
|
331
|
return ( '' ); |
190
|
|
|
|
|
|
|
} |
191
|
|
|
|
|
|
|
} |
192
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
# TBD possibly add more formats |
195
|
|
|
|
|
|
|
# Dates parsed by Date::Parse |
196
|
|
|
|
|
|
|
# 1995:01:24T09:08:17.1823213 ISO-8601 |
197
|
|
|
|
|
|
|
# 1995-01-24T09:08:17.1823213 |
198
|
|
|
|
|
|
|
# Wed, 16 Jun 94 07:29:35 CST Comma and day name are optional |
199
|
|
|
|
|
|
|
# Thu, 13 Oct 94 10:13:13 -0700 |
200
|
|
|
|
|
|
|
# Wed, 9 Nov 1994 09:50:32 -0500 (EST) Text in ()'s will be ignored. |
201
|
|
|
|
|
|
|
# 21/dec/93 17:05 |
202
|
|
|
|
|
|
|
} |
203
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
|
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
############################################################################### |
208
|
|
|
|
|
|
|
# Usage : Function is overloaded to accept one of three date input types |
209
|
|
|
|
|
|
|
# : 1) Date string |
210
|
|
|
|
|
|
|
# : is_valid_date( SCALAR ) |
211
|
|
|
|
|
|
|
# : 2) Month, dayofmonth, year |
212
|
|
|
|
|
|
|
# : is_valid_date( SCALAR, SCALAR, SCALAR ) |
213
|
|
|
|
|
|
|
# : 3) Month, dayofmonth, year, dayofweek |
214
|
|
|
|
|
|
|
# : is_valid_date( SCALAR, SCALAR, SCALAR, SCALAR ) |
215
|
|
|
|
|
|
|
# Purpose : checks if date is valid |
216
|
|
|
|
|
|
|
# Returns : - '1' if date is valid |
217
|
|
|
|
|
|
|
# : - '' otherwise |
218
|
|
|
|
|
|
|
# Parameters : 1) ( date string in any format ) |
219
|
|
|
|
|
|
|
# : OR |
220
|
|
|
|
|
|
|
# : 2) ( month, day of month, year ) |
221
|
|
|
|
|
|
|
# : OR |
222
|
|
|
|
|
|
|
# : 3) ( month, day of month, year, dayofweek ) |
223
|
|
|
|
|
|
|
# Throws : No Exceptions |
224
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
225
|
|
|
|
|
|
|
# : - Month can be any of numeric, three character abbreviation or |
226
|
|
|
|
|
|
|
# : full |
227
|
|
|
|
|
|
|
# : - Day of week can be any of numeric, three character |
228
|
|
|
|
|
|
|
# : abbreviation or full |
229
|
|
|
|
|
|
|
# : - <1 for Jan ... 12 for Dec> |
230
|
|
|
|
|
|
|
# : - <1 for Mon ... 7 for Sun> |
231
|
|
|
|
|
|
|
# See Also : N/A |
232
|
|
|
|
|
|
|
############################################################################### |
233
|
|
|
|
|
|
|
sub is_valid_date |
234
|
|
|
|
|
|
|
{ |
235
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
|
237
|
|
|
|
|
|
|
# Incoming Inspection |
238
|
7542
|
100
|
100
|
7542
|
1
|
46176
|
if ( ( @_ != 1 ) && ( @_ != 3 ) && ( @_ != 4 ) ) |
|
|
|
100
|
|
|
|
|
239
|
|
|
|
|
|
|
{ |
240
|
3
|
|
|
|
|
18
|
return ( '' ); |
241
|
|
|
|
|
|
|
} |
242
|
|
|
|
|
|
|
|
243
|
|
|
|
|
|
|
|
244
|
7539
|
|
|
|
|
13361
|
my ( $month_input_00, $day_of_month_in_00, $year_in_00, $day_of_week_in_00 ); |
245
|
0
|
|
|
|
|
0
|
my $month_num_00; |
246
|
7539
|
100
|
|
|
|
22864
|
if ( @_ == 1 ) # recursive and back into 'is_valid_date' one time just to get date string parsed |
|
|
100
|
|
|
|
|
|
247
|
|
|
|
|
|
|
{ |
248
|
10
|
|
|
|
|
16
|
my $date_in_04 = $_[0]; |
249
|
10
|
100
|
|
|
|
34
|
if ( ref(\$date_in_04) ne 'SCALAR' ) |
250
|
|
|
|
|
|
|
{ |
251
|
1
|
|
|
|
|
6
|
return ( '' ); |
252
|
|
|
|
|
|
|
} |
253
|
|
|
|
|
|
|
|
254
|
9
|
100
|
|
|
|
23
|
if ( $date_in_04 eq '' ) |
255
|
|
|
|
|
|
|
{ |
256
|
1
|
|
|
|
|
6
|
return ( '' ); |
257
|
|
|
|
|
|
|
} |
258
|
|
|
|
|
|
|
|
259
|
8
|
100
|
|
|
|
18
|
if ( date_only_parse($date_in_04) eq '' ) |
260
|
|
|
|
|
|
|
{ |
261
|
6
|
|
|
|
|
33
|
return ( '' ); |
262
|
|
|
|
|
|
|
} |
263
|
|
|
|
|
|
|
else |
264
|
|
|
|
|
|
|
{ |
265
|
2
|
|
|
|
|
12
|
return ( '1' ); |
266
|
|
|
|
|
|
|
} |
267
|
|
|
|
|
|
|
} |
268
|
|
|
|
|
|
|
elsif ( @_ == 3 ) # day of week is NOT given by user |
269
|
|
|
|
|
|
|
{ |
270
|
6909
|
|
|
|
|
33902
|
( $month_input_00, $day_of_month_in_00, $year_in_00 ) = @_; |
271
|
6909
|
100
|
|
|
|
29991
|
if ( !(is_valid_month($month_input_00)) ) |
272
|
|
|
|
|
|
|
{ |
273
|
16
|
|
|
|
|
82
|
return ( '' ); |
274
|
|
|
|
|
|
|
} |
275
|
|
|
|
|
|
|
|
276
|
6893
|
100
|
|
|
|
17064
|
if ( !(is_valid_year($year_in_00)) ) |
277
|
|
|
|
|
|
|
{ |
278
|
1
|
|
|
|
|
6
|
return ( '' ); |
279
|
|
|
|
|
|
|
} |
280
|
|
|
|
|
|
|
|
281
|
6892
|
100
|
|
|
|
16229
|
if ( !(is_valid_day_of_month($month_input_00, $day_of_month_in_00, $year_in_00)) ) |
282
|
|
|
|
|
|
|
{ |
283
|
26
|
|
|
|
|
206
|
return ( '' ); |
284
|
|
|
|
|
|
|
} |
285
|
|
|
|
|
|
|
} |
286
|
|
|
|
|
|
|
else # day of week IS given by user |
287
|
|
|
|
|
|
|
{ |
288
|
620
|
|
|
|
|
2878
|
( $month_input_00, $day_of_month_in_00, $year_in_00, $day_of_week_in_00 ) = @_; |
289
|
620
|
100
|
|
|
|
1668
|
if ( !(is_valid_month($month_input_00)) ) |
290
|
|
|
|
|
|
|
{ |
291
|
1
|
|
|
|
|
5
|
return ( '' ); |
292
|
|
|
|
|
|
|
} |
293
|
|
|
|
|
|
|
|
294
|
619
|
100
|
|
|
|
1204
|
if ( !(is_valid_year($year_in_00)) ) |
295
|
|
|
|
|
|
|
{ |
296
|
1
|
|
|
|
|
6
|
return ( '' ); |
297
|
|
|
|
|
|
|
} |
298
|
|
|
|
|
|
|
|
299
|
618
|
100
|
|
|
|
1314
|
if ( !(is_valid_day_of_month($month_input_00, $day_of_month_in_00, $year_in_00)) ) |
300
|
|
|
|
|
|
|
{ |
301
|
4
|
|
|
|
|
26
|
return ( '' ); |
302
|
|
|
|
|
|
|
} |
303
|
|
|
|
|
|
|
|
304
|
614
|
100
|
|
|
|
1304
|
if ( !(is_valid_day_of_week($day_of_week_in_00)) ) |
305
|
|
|
|
|
|
|
{ |
306
|
3
|
|
|
|
|
18
|
return ( '' ); |
307
|
|
|
|
|
|
|
} |
308
|
|
|
|
|
|
|
} |
309
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
# Set to numeric forms |
312
|
7477
|
|
|
|
|
14905
|
$month_num_00 = set_month_to_month_number($month_input_00); |
313
|
|
|
|
|
|
|
|
314
|
7477
|
|
|
|
|
20241
|
my $day_of_week_on_day_n_00 = get_numeric_day_of_week( |
315
|
|
|
|
|
|
|
$month_num_00, # month in digits or alpha |
316
|
|
|
|
|
|
|
$day_of_month_in_00, # day of month in digits |
317
|
|
|
|
|
|
|
$year_in_00, # year in digits |
318
|
|
|
|
|
|
|
); |
319
|
|
|
|
|
|
|
|
320
|
|
|
|
|
|
|
# Check calculated day of week matches the input from user |
321
|
7477
|
100
|
|
|
|
15716
|
if ( $day_of_week_in_00 ) |
322
|
|
|
|
|
|
|
{ |
323
|
611
|
100
|
|
|
|
1641
|
if ( set_day_to_day_number($day_of_week_in_00) != $day_of_week_on_day_n_00 ) |
324
|
|
|
|
|
|
|
{ |
325
|
7
|
|
|
|
|
50
|
return ( '' ); |
326
|
|
|
|
|
|
|
} |
327
|
|
|
|
|
|
|
} |
328
|
|
|
|
|
|
|
|
329
|
7470
|
|
|
|
|
33353
|
return ( '1' ); |
330
|
|
|
|
|
|
|
} |
331
|
|
|
|
|
|
|
|
332
|
|
|
|
|
|
|
|
333
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
############################################################################### |
336
|
|
|
|
|
|
|
# Usage : calculate_day_of_week_for_first_of_month_in_next_year( SCALAR, SCALAR ) |
337
|
|
|
|
|
|
|
# Purpose : calculates the day of the week on the first of the month twelve months from the current month |
338
|
|
|
|
|
|
|
# Returns : numeric day of week if successful |
339
|
|
|
|
|
|
|
# Parameters : ( |
340
|
|
|
|
|
|
|
# : number of days between the first of the current month and the first of the month twelve months later, |
341
|
|
|
|
|
|
|
# : alpha or numeric_day_of_week for first of current month <1 for Mon ... 7 for Sun> |
342
|
|
|
|
|
|
|
# : ) |
343
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
344
|
|
|
|
|
|
|
# Comments : N/A |
345
|
|
|
|
|
|
|
# See Also : N/A |
346
|
|
|
|
|
|
|
############################################################################### |
347
|
|
|
|
|
|
|
sub calculate_day_of_week_for_first_of_month_in_next_year |
348
|
|
|
|
|
|
|
{ |
349
|
|
|
|
|
|
|
my ( |
350
|
18396
|
|
|
18396
|
1
|
38598
|
$num_days_in_year_02, |
351
|
|
|
|
|
|
|
$day_of_week_on_first_of_month_00, |
352
|
|
|
|
|
|
|
) |
353
|
|
|
|
|
|
|
= @_; |
354
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
|
356
|
|
|
|
|
|
|
# Incoming Inspection |
357
|
18396
|
|
|
|
|
33405
|
my $num_input_params_15 = 2; |
358
|
18396
|
100
|
|
|
|
49523
|
( @_ == $num_input_params_15) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_15 parameter(s), the number of days in a calender year (either 365 or 366). '@_'.\n\n\n"; |
|
5
|
|
|
|
|
590
|
|
359
|
18391
|
100
|
|
|
|
53222
|
( ref(\$num_days_in_year_02) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the number of days in a calender year (either 365 or 366) '$num_days_in_year_02'.\n\n\n"; |
|
1
|
|
|
|
|
149
|
|
360
|
18390
|
100
|
|
|
|
61866
|
( $num_days_in_year_02 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the number of days in a calender year (either 365 or 366) '$num_days_in_year_02'.\n\n\n"; |
|
1
|
|
|
|
|
112
|
|
361
|
18389
|
100
|
100
|
|
|
57675
|
( ( $num_days_in_year_02 eq '365' ) || ( $num_days_in_year_02 eq '366' ) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a number (1-7) for the number of days in a calender year (either 365 or 366) '$num_days_in_year_02'.\n\n\n"; |
|
3
|
|
|
|
|
315
|
|
362
|
|
|
|
|
|
|
|
363
|
18386
|
100
|
|
|
|
49552
|
( ref(\$day_of_week_on_first_of_month_00) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day of the week for the first of a month '$day_of_week_on_first_of_month_00'.\n\n\n"; |
|
1
|
|
|
|
|
146
|
|
364
|
18385
|
100
|
|
|
|
37857
|
( $day_of_week_on_first_of_month_00 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the day of the week for the first of a month '$day_of_week_on_first_of_month_00'.\n\n\n"; |
|
1
|
|
|
|
|
109
|
|
365
|
18384
|
100
|
|
|
|
31166
|
( is_valid_day_of_week($day_of_week_on_first_of_month_00) =~ m/^\d$/ ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a number (1-7) for the day of the week for the first of a month '$day_of_week_on_first_of_month_00'.\n\n\n"; |
|
2
|
|
|
|
|
362
|
|
366
|
|
|
|
|
|
|
|
367
|
18382
|
|
|
|
|
35979
|
$day_of_week_on_first_of_month_00 = set_day_to_day_number($day_of_week_on_first_of_month_00); |
368
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
|
370
|
18382
|
|
|
|
|
49561
|
$day_of_week_on_first_of_month_00 += ($num_days_in_year_02) % 7; |
371
|
18382
|
100
|
|
|
|
35573
|
if ( $day_of_week_on_first_of_month_00 > 7 ) |
372
|
|
|
|
|
|
|
{ |
373
|
3271
|
|
|
|
|
4144
|
$day_of_week_on_first_of_month_00 -= 7; |
374
|
|
|
|
|
|
|
} |
375
|
|
|
|
|
|
|
|
376
|
18382
|
|
|
|
|
146179
|
return ( $day_of_week_on_first_of_month_00 ); |
377
|
|
|
|
|
|
|
} |
378
|
|
|
|
|
|
|
|
379
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
|
381
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
############################################################################### |
383
|
|
|
|
|
|
|
# Usage : is_leap_year( SCALAR ) |
384
|
|
|
|
|
|
|
# Purpose : determine if year is a leap year or not |
385
|
|
|
|
|
|
|
# Returns : - 'yes' if the input is a leap year |
386
|
|
|
|
|
|
|
# : - '' if the input is a NON leap year |
387
|
|
|
|
|
|
|
# Parameters : ( |
388
|
|
|
|
|
|
|
# : year in integer form |
389
|
|
|
|
|
|
|
# : ) |
390
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
391
|
|
|
|
|
|
|
# Comments : Handles all years, even negative years (aka BC) |
392
|
|
|
|
|
|
|
# See Also : N/A |
393
|
|
|
|
|
|
|
############################################################################### |
394
|
|
|
|
|
|
|
sub is_leap_year |
395
|
|
|
|
|
|
|
{ |
396
|
|
|
|
|
|
|
my ( |
397
|
372398
|
|
|
372398
|
1
|
588527
|
$year_in_01, |
398
|
|
|
|
|
|
|
) |
399
|
|
|
|
|
|
|
= @_; |
400
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
|
402
|
|
|
|
|
|
|
# Incoming Inspection |
403
|
372398
|
|
|
|
|
450751
|
my $num_input_params_01 = 1; |
404
|
372398
|
100
|
|
|
|
879539
|
( @_ == $num_input_params_01) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly one parameter, a year number. '@_'.\n\n\n"; |
|
2
|
|
|
|
|
345
|
|
405
|
372396
|
100
|
|
|
|
930009
|
( ref(\$year_in_01) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year '$year_in_01'.\n\n\n"; |
|
2
|
|
|
|
|
254
|
|
406
|
372394
|
100
|
|
|
|
814802
|
( $year_in_01 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the year '$year_in_01'.\n\n\n"; |
|
1
|
|
|
|
|
128
|
|
407
|
372393
|
100
|
|
|
|
1331119
|
( $year_in_01 =~ m/^\-{0,1}\d+$/ ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a number for the year '$year_in_01'.\n\n\n"; |
|
3
|
|
|
|
|
401
|
|
408
|
|
|
|
|
|
|
|
409
|
|
|
|
|
|
|
|
410
|
372390
|
|
|
|
|
508171
|
my $leap_year_status_01 = 'yes'; |
411
|
372390
|
100
|
|
|
|
873841
|
if ( $year_in_01 % 4 > 0 ) |
412
|
|
|
|
|
|
|
{ |
413
|
277880
|
|
|
|
|
407356
|
$leap_year_status_01 = ''; |
414
|
|
|
|
|
|
|
} |
415
|
372390
|
100
|
100
|
|
|
1011372
|
if ( ( $year_in_01 % 100 == 0 ) && ( $year_in_01 % 400 > 0 ) ) |
416
|
|
|
|
|
|
|
{ |
417
|
2869
|
|
|
|
|
4678
|
$leap_year_status_01 = ''; |
418
|
|
|
|
|
|
|
} |
419
|
|
|
|
|
|
|
|
420
|
372390
|
|
|
|
|
1082032
|
return ( $leap_year_status_01 ); |
421
|
|
|
|
|
|
|
} |
422
|
|
|
|
|
|
|
|
423
|
|
|
|
|
|
|
|
424
|
|
|
|
|
|
|
|
425
|
|
|
|
|
|
|
|
426
|
|
|
|
|
|
|
############################################################################### |
427
|
|
|
|
|
|
|
# Usage : get_year_phase( SCALAR ) |
428
|
|
|
|
|
|
|
# Purpose : determine the phase of the current year within the standard 400 year cycle |
429
|
|
|
|
|
|
|
# Returns : - year phase (0-399) for the given year if input is valid |
430
|
|
|
|
|
|
|
# Parameters : ( |
431
|
|
|
|
|
|
|
# : year in integer form |
432
|
|
|
|
|
|
|
# : ) |
433
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
434
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
435
|
|
|
|
|
|
|
# : - years repeat in a standard 400 year cycle where year 2000 is defined by this program to be phase '0' and year 2399 is then phase '399' |
436
|
|
|
|
|
|
|
# : - examples: years -1, 399 and 1999 are all phase 399 |
437
|
|
|
|
|
|
|
# : years -400, 0, 1600 and 2000 are all phase 0 |
438
|
|
|
|
|
|
|
# : year 1946 is phase 346 |
439
|
|
|
|
|
|
|
# See Also : N/A |
440
|
|
|
|
|
|
|
############################################################################### |
441
|
|
|
|
|
|
|
sub get_year_phase |
442
|
|
|
|
|
|
|
{ |
443
|
|
|
|
|
|
|
my ( |
444
|
236253
|
|
|
236253
|
1
|
379061
|
$year_in_02, |
445
|
|
|
|
|
|
|
) |
446
|
|
|
|
|
|
|
= @_; |
447
|
|
|
|
|
|
|
|
448
|
|
|
|
|
|
|
|
449
|
|
|
|
|
|
|
# Incoming Inspection |
450
|
236253
|
|
|
|
|
287829
|
my $num_input_params_02 = 1; |
451
|
236253
|
100
|
|
|
|
503485
|
( @_ == $num_input_params_02) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly one parameter, a year number. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
214
|
|
452
|
236252
|
100
|
|
|
|
568100
|
( ref(\$year_in_02) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year '$year_in_02'.\n\n\n"; |
|
2
|
|
|
|
|
308
|
|
453
|
236250
|
100
|
|
|
|
569517
|
( $year_in_02 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the year '$year_in_02'.\n\n\n"; |
|
1
|
|
|
|
|
215
|
|
454
|
236249
|
100
|
|
|
|
822761
|
( $year_in_02 =~ m/^\-{0,1}\d+$/ ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a number for the year '$year_in_02'.\n\n\n"; |
|
3
|
|
|
|
|
524
|
|
455
|
|
|
|
|
|
|
|
456
|
236246
|
|
|
|
|
890551
|
my $year_offset_00 = $year_in_02 - $DATE_BASELINE_YEAR_2000; |
457
|
236246
|
|
|
|
|
1341425
|
my $year_phase_00; |
458
|
|
|
|
|
|
|
|
459
|
236246
|
100
|
|
|
|
678716
|
if ( $year_offset_00 > 0 ) |
|
|
100
|
|
|
|
|
|
460
|
|
|
|
|
|
|
{ |
461
|
3388
|
|
|
|
|
8684
|
$year_phase_00 = $year_offset_00 % $NUMBER_OF_YEAR_PHASES; |
462
|
|
|
|
|
|
|
} |
463
|
|
|
|
|
|
|
elsif ( $year_offset_00 < 0 ) |
464
|
|
|
|
|
|
|
{ |
465
|
231173
|
|
|
|
|
727539
|
$year_phase_00 = $NUMBER_OF_YEAR_PHASES - ( (-$year_offset_00) % $NUMBER_OF_YEAR_PHASES); |
466
|
231173
|
100
|
|
|
|
1902041
|
if ( $year_phase_00 == 400 ) |
467
|
|
|
|
|
|
|
{ |
468
|
2740
|
|
|
|
|
5929
|
$year_phase_00 = '0'; |
469
|
|
|
|
|
|
|
} |
470
|
|
|
|
|
|
|
} |
471
|
|
|
|
|
|
|
else |
472
|
|
|
|
|
|
|
{ |
473
|
1685
|
|
|
|
|
3111
|
$year_phase_00 = ''; |
474
|
|
|
|
|
|
|
} |
475
|
|
|
|
|
|
|
|
476
|
236246
|
100
|
|
|
|
551184
|
if ( $year_phase_00 eq '') |
477
|
|
|
|
|
|
|
{ |
478
|
1685
|
|
|
|
|
2749
|
$year_phase_00 = '0'; |
479
|
|
|
|
|
|
|
} |
480
|
|
|
|
|
|
|
|
481
|
236246
|
|
|
|
|
564416
|
return ( $year_phase_00 ); |
482
|
|
|
|
|
|
|
} |
483
|
|
|
|
|
|
|
|
484
|
|
|
|
|
|
|
|
485
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
|
487
|
|
|
|
|
|
|
############################################################################### |
488
|
|
|
|
|
|
|
# Usage : number_of_day_within_year( SCALAR ) |
489
|
|
|
|
|
|
|
# Purpose : get the day number within the year |
490
|
|
|
|
|
|
|
# Returns : integer day number if successful |
491
|
|
|
|
|
|
|
# Parameters : ( |
492
|
|
|
|
|
|
|
# : text string containing date in various formats which are parsed |
493
|
|
|
|
|
|
|
# : ) |
494
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
495
|
|
|
|
|
|
|
# Comments : Jan 31 ALWAYS returns '31' and Dec 31 returns either '365' or '366' depending upon leap year |
496
|
|
|
|
|
|
|
# See Also : N/A |
497
|
|
|
|
|
|
|
############################################################################### |
498
|
|
|
|
|
|
|
sub number_of_day_within_year |
499
|
|
|
|
|
|
|
{ |
500
|
|
|
|
|
|
|
my ( |
501
|
2288
|
|
|
2288
|
1
|
13855
|
$date_in_00, |
502
|
|
|
|
|
|
|
) |
503
|
|
|
|
|
|
|
= @_; |
504
|
|
|
|
|
|
|
|
505
|
|
|
|
|
|
|
|
506
|
|
|
|
|
|
|
# Incoming Inspection |
507
|
2288
|
|
|
|
|
4468
|
my $num_input_params_00 = 1; |
508
|
2288
|
100
|
|
|
|
7770
|
( @_ == $num_input_params_00) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly one parameter, a date string. '@_'.\n\n\n"; |
|
2
|
|
|
|
|
452
|
|
509
|
2286
|
100
|
|
|
|
15604
|
( ref(\$date_in_00) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the date string '$date_in_00'.\n\n\n"; |
|
2
|
|
|
|
|
255
|
|
510
|
2284
|
100
|
|
|
|
7122
|
( $date_in_00 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the date string '$date_in_00'.\n\n\n"; |
|
1
|
|
|
|
|
131
|
|
511
|
2283
|
100
|
|
|
|
6311
|
( date_only_parse($date_in_00) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the date from the input date string '$date_in_00'.\n\n\n"; |
|
5
|
|
|
|
|
637
|
|
512
|
|
|
|
|
|
|
|
513
|
2278
|
|
|
|
|
8014
|
my ( $month_num_01, $day_of_month_01, $year_num_01, $day_of_week_01 ) = date_only_parse($date_in_00); |
514
|
|
|
|
|
|
|
|
515
|
2278
|
|
|
|
|
7650
|
my $month_num_05 = set_month_to_month_number($month_num_01); |
516
|
|
|
|
|
|
|
|
517
|
|
|
|
|
|
|
|
518
|
2278
|
|
|
|
|
4134
|
my $number_of_day_in_year = $day_of_month_01; |
519
|
2278
|
|
|
|
|
6802
|
for ( my $iii_001=0; $iii_001<($month_num_05-1); $iii_001++ ) |
520
|
|
|
|
|
|
|
{ |
521
|
13163
|
100
|
|
|
|
28087
|
if ( $iii_001 == 1 ) |
522
|
|
|
|
|
|
|
{ |
523
|
1912
|
100
|
|
|
|
5596
|
if ( is_leap_year($year_num_01) ) |
524
|
|
|
|
|
|
|
{ |
525
|
687
|
|
|
|
|
1954
|
$number_of_day_in_year += get_number_of_days_in_month($iii_001+1, $year_num_01); |
526
|
|
|
|
|
|
|
} |
527
|
|
|
|
|
|
|
else |
528
|
|
|
|
|
|
|
{ |
529
|
1225
|
|
|
|
|
3047
|
$number_of_day_in_year += get_number_of_days_in_month($iii_001+1, $year_num_01); |
530
|
|
|
|
|
|
|
} |
531
|
|
|
|
|
|
|
} |
532
|
|
|
|
|
|
|
else |
533
|
|
|
|
|
|
|
{ |
534
|
11251
|
|
|
|
|
27233
|
$number_of_day_in_year += get_number_of_days_in_month($iii_001+1, $year_num_01); |
535
|
|
|
|
|
|
|
} |
536
|
|
|
|
|
|
|
} |
537
|
|
|
|
|
|
|
|
538
|
2278
|
|
|
|
|
18281
|
return ( $number_of_day_in_year ) ; |
539
|
|
|
|
|
|
|
} |
540
|
|
|
|
|
|
|
|
541
|
|
|
|
|
|
|
|
542
|
|
|
|
|
|
|
|
543
|
|
|
|
|
|
|
|
544
|
|
|
|
|
|
|
############################################################################### |
545
|
|
|
|
|
|
|
# Usage : month_name_to_month_number( SCALAR ) |
546
|
|
|
|
|
|
|
# Purpose : convert alpha month name to month number |
547
|
|
|
|
|
|
|
# Returns : integer month number (1-12) if successful |
548
|
|
|
|
|
|
|
# Parameters : full or three character abbreviated month name |
549
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
550
|
|
|
|
|
|
|
# Comments : N/A |
551
|
|
|
|
|
|
|
# See Also : N/A |
552
|
|
|
|
|
|
|
############################################################################### |
553
|
|
|
|
|
|
|
sub month_name_to_month_number |
554
|
|
|
|
|
|
|
{ |
555
|
|
|
|
|
|
|
my ( |
556
|
283530
|
|
|
283530
|
1
|
440353
|
$month_in_02, |
557
|
|
|
|
|
|
|
) |
558
|
|
|
|
|
|
|
= @_; |
559
|
|
|
|
|
|
|
|
560
|
|
|
|
|
|
|
|
561
|
|
|
|
|
|
|
# Incoming Inspection |
562
|
283530
|
|
|
|
|
344562
|
my $num_input_params_14 = 1; |
563
|
283530
|
100
|
|
|
|
604314
|
( @_ == $num_input_params_14) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_14 parameter(s), a month string. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
166
|
|
564
|
283529
|
100
|
|
|
|
647575
|
( ref(\$month_in_02) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month string '$month_in_02'.\n\n\n"; |
|
2
|
|
|
|
|
275
|
|
565
|
283527
|
100
|
|
|
|
625269
|
( $month_in_02 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the month string '$month_in_02'.\n\n\n"; |
|
1
|
|
|
|
|
131
|
|
566
|
|
|
|
|
|
|
|
567
|
|
|
|
|
|
|
|
568
|
|
|
|
|
|
|
# Check for expected strings |
569
|
283526
|
100
|
|
|
|
549042
|
( is_valid_month($month_in_02) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the month from the input month string '$month_in_02'.\n\n\n"; |
|
3
|
|
|
|
|
443
|
|
570
|
283523
|
|
|
|
|
722998
|
$month_in_02 =~ m/^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|January|February|March|April|May|June|July|August|September|October|November|December)$/i; |
571
|
|
|
|
|
|
|
|
572
|
|
|
|
|
|
|
|
573
|
283523
|
|
|
|
|
839439
|
foreach ( uc($1) ) |
574
|
|
|
|
|
|
|
{ |
575
|
|
|
|
|
|
|
SWITCH: |
576
|
|
|
|
|
|
|
{ |
577
|
283523
|
100
|
|
|
|
336878
|
if ( /^(JAN|JANUARY)$/ ) { return ( 1 ); last SWITCH; } |
|
283523
|
|
|
|
|
702443
|
|
|
25870
|
|
|
|
|
70775
|
|
|
0
|
|
|
|
|
0
|
|
578
|
257653
|
100
|
|
|
|
581807
|
if ( /^(FEB|FEBRUARY)$/ ) { return ( 2 ); last SWITCH; } |
|
23705
|
|
|
|
|
65141
|
|
|
0
|
|
|
|
|
0
|
|
579
|
233948
|
100
|
|
|
|
542550
|
if ( /^(MAR|MARCH)$/ ) { return ( 3 ); last SWITCH; } |
|
22747
|
|
|
|
|
102757
|
|
|
0
|
|
|
|
|
0
|
|
580
|
211201
|
100
|
|
|
|
483291
|
if ( /^(APR|APRIL)$/ ) { return ( 4 ); last SWITCH; } |
|
22433
|
|
|
|
|
67779
|
|
|
0
|
|
|
|
|
0
|
|
581
|
188768
|
100
|
|
|
|
474464
|
if ( /^(MAY|MAY)$/ ) { return ( 5 ); last SWITCH; } |
|
22056
|
|
|
|
|
68351
|
|
|
0
|
|
|
|
|
0
|
|
582
|
166712
|
100
|
|
|
|
390213
|
if ( /^(JUN|JUNE)$/ ) { return ( 6 ); last SWITCH; } |
|
21960
|
|
|
|
|
63145
|
|
|
0
|
|
|
|
|
0
|
|
583
|
144752
|
100
|
|
|
|
333513
|
if ( /^(JUL|JULY)$/ ) { return ( 7 ); last SWITCH; } |
|
31190
|
|
|
|
|
105453
|
|
|
0
|
|
|
|
|
0
|
|
584
|
113562
|
100
|
|
|
|
253467
|
if ( /^(AUG|AUGUST)$/ ) { return ( 8 ); last SWITCH; } |
|
21371
|
|
|
|
|
60273
|
|
|
0
|
|
|
|
|
0
|
|
585
|
92191
|
100
|
|
|
|
218804
|
if ( /^(SEP|SEPTEMBER)$/ ) { return ( 9 ); last SWITCH; } |
|
21263
|
|
|
|
|
62937
|
|
|
0
|
|
|
|
|
0
|
|
586
|
70928
|
100
|
|
|
|
206297
|
if ( /^(OCT|OCTOBER)$/ ) { return ( 10 ); last SWITCH; } |
|
23923
|
|
|
|
|
68197
|
|
|
0
|
|
|
|
|
0
|
|
587
|
47005
|
100
|
|
|
|
128373
|
if ( /^(NOV|NOVEMBER)$/ ) { return ( 11 ); last SWITCH; } |
|
21166
|
|
|
|
|
61317
|
|
|
0
|
|
|
|
|
0
|
|
588
|
25839
|
100
|
|
|
|
96535
|
if ( /^(DEC|DECEMBER)$/ ) { return ( 12 ); last SWITCH; } |
|
25838
|
|
|
|
|
82029
|
|
|
0
|
|
|
|
|
0
|
|
589
|
1
|
|
|
|
|
5
|
croak "\n\n ($0) '${\(caller(0))[3]}' This month of year condition, '$month_in_02', must be in alpha form. Something is amiss.\n\n\n"; |
|
1
|
|
|
|
|
144
|
|
590
|
|
|
|
|
|
|
} |
591
|
|
|
|
|
|
|
} |
592
|
|
|
|
|
|
|
} |
593
|
|
|
|
|
|
|
|
594
|
|
|
|
|
|
|
|
595
|
|
|
|
|
|
|
|
596
|
|
|
|
|
|
|
|
597
|
|
|
|
|
|
|
############################################################################### |
598
|
|
|
|
|
|
|
# Usage : day_name_to_day_number( SCALAR ) |
599
|
|
|
|
|
|
|
# Purpose : convert alpha day of week name to day of week number |
600
|
|
|
|
|
|
|
# Returns : integer day of week number (1-7) if successful |
601
|
|
|
|
|
|
|
# Parameters : full or three character abbreviated day of week name |
602
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
603
|
|
|
|
|
|
|
# Comments : <1 for Mon ... 7 for Sun> |
604
|
|
|
|
|
|
|
# See Also : N/A |
605
|
|
|
|
|
|
|
############################################################################### |
606
|
|
|
|
|
|
|
sub day_name_to_day_number |
607
|
|
|
|
|
|
|
{ |
608
|
|
|
|
|
|
|
my ( |
609
|
239884
|
|
|
239884
|
1
|
356664
|
$day_in_02, |
610
|
|
|
|
|
|
|
) |
611
|
|
|
|
|
|
|
= @_; |
612
|
|
|
|
|
|
|
|
613
|
|
|
|
|
|
|
|
614
|
|
|
|
|
|
|
# Incoming Inspection |
615
|
239884
|
|
|
|
|
324140
|
my $num_input_params_05 = 1; |
616
|
239884
|
100
|
|
|
|
552913
|
( @_ == $num_input_params_05) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly one parameter, a day string. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
164
|
|
617
|
239883
|
100
|
|
|
|
8612996
|
( ref(\$day_in_02) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day string '$day_in_02'.\n\n\n"; |
|
2
|
|
|
|
|
301
|
|
618
|
239881
|
100
|
|
|
|
530781
|
( $day_in_02 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the day string '$day_in_02'.\n\n\n"; |
|
1
|
|
|
|
|
131
|
|
619
|
|
|
|
|
|
|
|
620
|
|
|
|
|
|
|
|
621
|
|
|
|
|
|
|
# Check for expected strings |
622
|
239880
|
100
|
|
|
|
496246
|
( is_valid_day_of_week($day_in_02) ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the day from the input day string '$day_in_02'.\n\n\n"; |
|
5
|
|
|
|
|
815
|
|
623
|
239875
|
|
|
|
|
771467
|
$day_in_02 =~ m/^(\d|Mon|Tue|Wed|Thu|Fri|Sat|Sun|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)$/i; |
624
|
|
|
|
|
|
|
|
625
|
239875
|
|
|
|
|
6968873
|
foreach ( uc($1) ) |
626
|
|
|
|
|
|
|
{ |
627
|
|
|
|
|
|
|
SWITCH: |
628
|
|
|
|
|
|
|
{ |
629
|
239875
|
100
|
|
|
|
299366
|
if ( /^(MON|MONDAY)$/ ) { return ( 1 ); last SWITCH; } |
|
239875
|
|
|
|
|
598956
|
|
|
33626
|
|
|
|
|
143325
|
|
|
0
|
|
|
|
|
0
|
|
630
|
206249
|
100
|
|
|
|
495444
|
if ( /^(TUE|TUESDAY)$/ ) { return ( 2 ); last SWITCH; } |
|
34801
|
|
|
|
|
113332
|
|
|
0
|
|
|
|
|
0
|
|
631
|
171448
|
100
|
|
|
|
406318
|
if ( /^(WED|WEDNESDAY)$/ ) { return ( 3 ); last SWITCH; } |
|
34178
|
|
|
|
|
97086
|
|
|
0
|
|
|
|
|
0
|
|
632
|
137270
|
100
|
|
|
|
319610
|
if ( /^(THU|THURSDAY)$/ ) { return ( 4 ); last SWITCH; } |
|
34173
|
|
|
|
|
89598
|
|
|
0
|
|
|
|
|
0
|
|
633
|
103097
|
100
|
|
|
|
258423
|
if ( /^(FRI|FRIDAY)$/ ) { return ( 5 ); last SWITCH; } |
|
34808
|
|
|
|
|
112203
|
|
|
0
|
|
|
|
|
0
|
|
634
|
68289
|
100
|
|
|
|
195347
|
if ( /^(SAT|SATURDAY)$/ ) { return ( 6 ); last SWITCH; } |
|
33569
|
|
|
|
|
103125
|
|
|
0
|
|
|
|
|
0
|
|
635
|
34720
|
100
|
|
|
|
136395
|
if ( /^(SUN|SUNDAY)$/ ) { return ( 7 ); last SWITCH; } |
|
34719
|
|
|
|
|
113433
|
|
|
0
|
|
|
|
|
0
|
|
636
|
1
|
|
|
|
|
4
|
croak "\n\n ($0) '${\(caller(0))[3]}' This day of week value, '$day_in_02', should not occur. Something is amiss.\n\n\n"; |
|
1
|
|
|
|
|
139
|
|
637
|
|
|
|
|
|
|
} |
638
|
|
|
|
|
|
|
} |
639
|
|
|
|
|
|
|
} |
640
|
|
|
|
|
|
|
|
641
|
|
|
|
|
|
|
|
642
|
|
|
|
|
|
|
|
643
|
|
|
|
|
|
|
|
644
|
|
|
|
|
|
|
############################################################################### |
645
|
|
|
|
|
|
|
# Usage : month_number_to_month_name( SCALAR ) |
646
|
|
|
|
|
|
|
# Purpose : convert month number to month alpha |
647
|
|
|
|
|
|
|
# Returns : three character abbreviated month name if successful |
648
|
|
|
|
|
|
|
# Parameters : month number (1-12) |
649
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
650
|
|
|
|
|
|
|
# Comments : N/A |
651
|
|
|
|
|
|
|
# See Also : N/A |
652
|
|
|
|
|
|
|
############################################################################### |
653
|
|
|
|
|
|
|
sub month_number_to_month_name |
654
|
|
|
|
|
|
|
{ |
655
|
|
|
|
|
|
|
my ( |
656
|
280242
|
|
|
280242
|
1
|
398825
|
$month_in_03, |
657
|
|
|
|
|
|
|
) |
658
|
|
|
|
|
|
|
= @_; |
659
|
|
|
|
|
|
|
|
660
|
|
|
|
|
|
|
|
661
|
|
|
|
|
|
|
# Incoming Inspection |
662
|
280242
|
|
|
|
|
353991
|
my $num_input_params_06 = 1; |
663
|
280242
|
100
|
|
|
|
608606
|
( @_ == $num_input_params_06) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly one parameter, a month number. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
209
|
|
664
|
280241
|
100
|
|
|
|
735031
|
( ref(\$month_in_03) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month number '$month_in_03'.\n\n\n"; |
|
2
|
|
|
|
|
274
|
|
665
|
280239
|
100
|
|
|
|
565429
|
( $month_in_03 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the month number '$month_in_03'.\n\n\n"; |
|
1
|
|
|
|
|
140
|
|
666
|
|
|
|
|
|
|
|
667
|
|
|
|
|
|
|
# Check for expected strings |
668
|
280238
|
100
|
|
|
|
941650
|
( $month_in_03 =~ m/^(\d{1,2})$/i ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the month from the input month number '$month_in_03'.\n\n\n"; |
|
4
|
|
|
|
|
573
|
|
669
|
|
|
|
|
|
|
|
670
|
|
|
|
|
|
|
|
671
|
280234
|
|
|
|
|
493786
|
foreach ($1) |
672
|
|
|
|
|
|
|
{ |
673
|
|
|
|
|
|
|
SWITCH: |
674
|
|
|
|
|
|
|
{ |
675
|
280234
|
100
|
|
|
|
318387
|
if ( $_ == 1 ) { return ( 'Jan' ); last SWITCH; } |
|
280234
|
|
|
|
|
784916
|
|
|
25339
|
|
|
|
|
74329
|
|
|
0
|
|
|
|
|
0
|
|
676
|
254895
|
100
|
|
|
|
598070
|
if ( $_ == 2 ) { return ( 'Feb' ); last SWITCH; } |
|
23412
|
|
|
|
|
90198
|
|
|
0
|
|
|
|
|
0
|
|
677
|
231483
|
100
|
|
|
|
583148
|
if ( $_ == 3 ) { return ( 'Mar' ); last SWITCH; } |
|
22723
|
|
|
|
|
78637
|
|
|
0
|
|
|
|
|
0
|
|
678
|
208760
|
100
|
|
|
|
504572
|
if ( $_ == 4 ) { return ( 'Apr' ); last SWITCH; } |
|
22414
|
|
|
|
|
76384
|
|
|
0
|
|
|
|
|
0
|
|
679
|
186346
|
100
|
|
|
|
423771
|
if ( $_ == 5 ) { return ( 'May' ); last SWITCH; } |
|
21987
|
|
|
|
|
72838
|
|
|
0
|
|
|
|
|
0
|
|
680
|
164359
|
100
|
|
|
|
378059
|
if ( $_ == 6 ) { return ( 'Jun' ); last SWITCH; } |
|
21910
|
|
|
|
|
66964
|
|
|
0
|
|
|
|
|
0
|
|
681
|
142449
|
100
|
|
|
|
335612
|
if ( $_ == 7 ) { return ( 'Jul' ); last SWITCH; } |
|
29184
|
|
|
|
|
97694
|
|
|
0
|
|
|
|
|
0
|
|
682
|
113265
|
100
|
|
|
|
234435
|
if ( $_ == 8 ) { return ( 'Aug' ); last SWITCH; } |
|
21341
|
|
|
|
|
71437
|
|
|
0
|
|
|
|
|
0
|
|
683
|
91924
|
100
|
|
|
|
216666
|
if ( $_ == 9 ) { return ( 'Sep' ); last SWITCH; } |
|
21179
|
|
|
|
|
67514
|
|
|
0
|
|
|
|
|
0
|
|
684
|
70745
|
100
|
|
|
|
153171
|
if ( $_ == 10 ) { return ( 'Oct' ); last SWITCH; } |
|
23847
|
|
|
|
|
73196
|
|
|
0
|
|
|
|
|
0
|
|
685
|
46898
|
100
|
|
|
|
118366
|
if ( $_ == 11 ) { return ( 'Nov' ); last SWITCH; } |
|
21143
|
|
|
|
|
69782
|
|
|
0
|
|
|
|
|
0
|
|
686
|
25755
|
100
|
|
|
|
64421
|
if ( $_ == 12 ) { return ( 'Dec' ); last SWITCH; } |
|
25749
|
|
|
|
|
79958
|
|
|
0
|
|
|
|
|
0
|
|
687
|
6
|
|
|
|
|
22
|
croak "\n\n ($0) '${\(caller(0))[3]}' This month of year value, '$month_in_03', should not occur. Something is amiss.\n\n\n"; |
|
6
|
|
|
|
|
851
|
|
688
|
|
|
|
|
|
|
} |
689
|
|
|
|
|
|
|
} |
690
|
|
|
|
|
|
|
} |
691
|
|
|
|
|
|
|
|
692
|
|
|
|
|
|
|
|
693
|
|
|
|
|
|
|
|
694
|
|
|
|
|
|
|
|
695
|
|
|
|
|
|
|
############################################################################### |
696
|
|
|
|
|
|
|
# Usage : day_number_to_day_name( SCALAR ) |
697
|
|
|
|
|
|
|
# Purpose : convert day of week number to day of week alpha |
698
|
|
|
|
|
|
|
# Returns : three character abbreviated day of week name if successful |
699
|
|
|
|
|
|
|
# Parameters : day of week number (1-7) |
700
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
701
|
|
|
|
|
|
|
# Comments : <1 for Mon ... 7 for Sun> |
702
|
|
|
|
|
|
|
# See Also : N/A |
703
|
|
|
|
|
|
|
############################################################################### |
704
|
|
|
|
|
|
|
sub day_number_to_day_name |
705
|
|
|
|
|
|
|
{ |
706
|
|
|
|
|
|
|
my ( |
707
|
239255
|
|
|
239255
|
1
|
402411
|
$day_in_03, |
708
|
|
|
|
|
|
|
) |
709
|
|
|
|
|
|
|
= @_; |
710
|
|
|
|
|
|
|
|
711
|
|
|
|
|
|
|
|
712
|
|
|
|
|
|
|
# Incoming Inspection |
713
|
239255
|
|
|
|
|
317984
|
my $num_input_params_07 = 1; |
714
|
239255
|
100
|
|
|
|
553882
|
( @_ == $num_input_params_07) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly one parameter, a day number. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
210
|
|
715
|
239254
|
100
|
|
|
|
602814
|
( ref(\$day_in_03) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day number '$day_in_03'.\n\n\n"; |
|
2
|
|
|
|
|
248
|
|
716
|
239252
|
100
|
|
|
|
556284
|
( $day_in_03 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the day number '$day_in_03'.\n\n\n"; |
|
1
|
|
|
|
|
142
|
|
717
|
|
|
|
|
|
|
|
718
|
|
|
|
|
|
|
|
719
|
|
|
|
|
|
|
# Check for expected strings |
720
|
239251
|
100
|
|
|
|
816414
|
( $day_in_03 =~ m/^(\d{1,2})$/i ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the day from the input day number '$day_in_03'.\n\n\n"; |
|
3
|
|
|
|
|
412
|
|
721
|
|
|
|
|
|
|
|
722
|
|
|
|
|
|
|
|
723
|
239248
|
|
|
|
|
472342
|
foreach ($1) |
724
|
|
|
|
|
|
|
{ |
725
|
|
|
|
|
|
|
SWITCH: |
726
|
|
|
|
|
|
|
{ |
727
|
239248
|
100
|
|
|
|
305198
|
if ( $_ == 1 ) { return ( 'Mon' ); last SWITCH; } |
|
239248
|
|
|
|
|
685376
|
|
|
33509
|
|
|
|
|
99269
|
|
|
0
|
|
|
|
|
0
|
|
728
|
205739
|
100
|
|
|
|
509039
|
if ( $_ == 2 ) { return ( 'Tue' ); last SWITCH; } |
|
34694
|
|
|
|
|
107385
|
|
|
0
|
|
|
|
|
0
|
|
729
|
171045
|
100
|
|
|
|
396926
|
if ( $_ == 3 ) { return ( 'Wed' ); last SWITCH; } |
|
34096
|
|
|
|
|
105164
|
|
|
0
|
|
|
|
|
0
|
|
730
|
136949
|
100
|
|
|
|
329906
|
if ( $_ == 4 ) { return ( 'Thu' ); last SWITCH; } |
|
34095
|
|
|
|
|
111380
|
|
|
0
|
|
|
|
|
0
|
|
731
|
102854
|
100
|
|
|
|
239591
|
if ( $_ == 5 ) { return ( 'Fri' ); last SWITCH; } |
|
34650
|
|
|
|
|
127015
|
|
|
0
|
|
|
|
|
0
|
|
732
|
68204
|
100
|
|
|
|
161868
|
if ( $_ == 6 ) { return ( 'Sat' ); last SWITCH; } |
|
33502
|
|
|
|
|
107891
|
|
|
0
|
|
|
|
|
0
|
|
733
|
34702
|
100
|
|
|
|
116706
|
if ( $_ == 7 ) { return ( 'Sun' ); last SWITCH; } |
|
34696
|
|
|
|
|
104985
|
|
|
0
|
|
|
|
|
0
|
|
734
|
6
|
|
|
|
|
22
|
croak "\n\n ($0) '${\(caller(0))[3]}' This day of week value, '$day_in_03', should not occur. Something is amiss.\n\n\n"; |
|
6
|
|
|
|
|
866
|
|
735
|
|
|
|
|
|
|
} |
736
|
|
|
|
|
|
|
} |
737
|
|
|
|
|
|
|
} |
738
|
|
|
|
|
|
|
|
739
|
|
|
|
|
|
|
|
740
|
|
|
|
|
|
|
|
741
|
|
|
|
|
|
|
|
742
|
|
|
|
|
|
|
############################################################################### |
743
|
|
|
|
|
|
|
# Usage : set_day_to_day_name_abbrev( SCALAR ) |
744
|
|
|
|
|
|
|
# Purpose : set the incoming day of week to three letter abbreviation |
745
|
|
|
|
|
|
|
# Returns : three character abbreviated day of week name if successful |
746
|
|
|
|
|
|
|
# Parameters : day of week in one of three formats ( numeric<1-7>, full name or three character abbreviated ) |
747
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
748
|
|
|
|
|
|
|
# Comments : <1 for Mon ... 7 for Sun> |
749
|
|
|
|
|
|
|
# See Also : N/A |
750
|
|
|
|
|
|
|
############################################################################### |
751
|
|
|
|
|
|
|
sub set_day_to_day_name_abbrev |
752
|
|
|
|
|
|
|
{ |
753
|
|
|
|
|
|
|
my ( |
754
|
35
|
|
|
35
|
1
|
5715
|
$day_in_04, |
755
|
|
|
|
|
|
|
) |
756
|
|
|
|
|
|
|
= @_; |
757
|
|
|
|
|
|
|
|
758
|
|
|
|
|
|
|
|
759
|
|
|
|
|
|
|
# Incoming Inspection |
760
|
35
|
|
|
|
|
50
|
my $num_input_params_08 = 1; |
761
|
35
|
100
|
|
|
|
97
|
( @_ == $num_input_params_08) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly one parameter, a day number or day alpha. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
183
|
|
762
|
34
|
100
|
|
|
|
104
|
( ref(\$day_in_04) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day number or day alpha '$day_in_04'.\n\n\n"; |
|
2
|
|
|
|
|
353
|
|
763
|
32
|
100
|
|
|
|
89
|
( $day_in_04 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the day number or day alpha '$day_in_04'.\n\n\n"; |
|
1
|
|
|
|
|
127
|
|
764
|
|
|
|
|
|
|
|
765
|
31
|
100
|
|
|
|
158
|
if ( $day_in_04 =~ m/^(\d{1,2})$/i ) |
766
|
|
|
|
|
|
|
{ |
767
|
15
|
|
|
|
|
47
|
return ( day_number_to_day_name($day_in_04) ); |
768
|
|
|
|
|
|
|
} |
769
|
|
|
|
|
|
|
else |
770
|
|
|
|
|
|
|
{ |
771
|
16
|
|
|
|
|
34
|
return ( day_number_to_day_name(day_name_to_day_number($day_in_04)) ); |
772
|
|
|
|
|
|
|
} |
773
|
|
|
|
|
|
|
} |
774
|
|
|
|
|
|
|
|
775
|
|
|
|
|
|
|
|
776
|
|
|
|
|
|
|
|
777
|
|
|
|
|
|
|
|
778
|
|
|
|
|
|
|
############################################################################### |
779
|
|
|
|
|
|
|
# Usage : set_day_to_day_name_full( SCALAR ) |
780
|
|
|
|
|
|
|
# Purpose : set the incoming day of week to full name |
781
|
|
|
|
|
|
|
# Returns : day of week FULL name if successful |
782
|
|
|
|
|
|
|
# Parameters : day of week in one of three formats ( numeric<1-7>, full name or three character abbreviated ) |
783
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
784
|
|
|
|
|
|
|
# Comments : <1 for Monday ... 7 for Sunday> |
785
|
|
|
|
|
|
|
# See Also : N/A |
786
|
|
|
|
|
|
|
############################################################################### |
787
|
|
|
|
|
|
|
sub set_day_to_day_name_full |
788
|
|
|
|
|
|
|
{ |
789
|
|
|
|
|
|
|
my ( |
790
|
18
|
|
|
18
|
1
|
6080
|
$day_in_06, |
791
|
|
|
|
|
|
|
) |
792
|
|
|
|
|
|
|
= @_; |
793
|
|
|
|
|
|
|
|
794
|
|
|
|
|
|
|
|
795
|
|
|
|
|
|
|
# Incoming Inspection |
796
|
18
|
|
|
|
|
28
|
my $num_input_params_35 = 1; |
797
|
18
|
100
|
|
|
|
49
|
( @_ == $num_input_params_35) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly ${num_input_params_35} parameter, a day number or day alpha. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
202
|
|
798
|
17
|
100
|
|
|
|
64
|
( ref(\$day_in_06) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day number or day alpha '$day_in_06'.\n\n\n"; |
|
2
|
|
|
|
|
260
|
|
799
|
15
|
100
|
|
|
|
47
|
( $day_in_06 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the day number or day alpha '$day_in_06'.\n\n\n"; |
|
1
|
|
|
|
|
134
|
|
800
|
14
|
100
|
|
|
|
31
|
( is_valid_day_of_week($day_in_06) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a valid the day of the week in either alpha or numeric format '$day_in_06'.\n\n\n"; |
|
4
|
|
|
|
|
633
|
|
801
|
|
|
|
|
|
|
|
802
|
|
|
|
|
|
|
|
803
|
10
|
|
|
|
|
23
|
my $day_of_week_10 = set_day_to_day_number($day_in_06); |
804
|
10
|
|
|
|
|
21
|
foreach ($day_of_week_10) |
805
|
|
|
|
|
|
|
{ |
806
|
|
|
|
|
|
|
SWITCH: |
807
|
|
|
|
|
|
|
{ |
808
|
10
|
100
|
|
|
|
14
|
if ( $_ == 1 ) { return ( 'Monday' ); last SWITCH; } |
|
10
|
|
|
|
|
54
|
|
|
1
|
|
|
|
|
6
|
|
|
0
|
|
|
|
|
0
|
|
809
|
9
|
100
|
|
|
|
25
|
if ( $_ == 2 ) { return ( 'Tuesday' ); last SWITCH; } |
|
2
|
|
|
|
|
11
|
|
|
0
|
|
|
|
|
0
|
|
810
|
7
|
100
|
|
|
|
21
|
if ( $_ == 3 ) { return ( 'Wednesday' ); last SWITCH; } |
|
1
|
|
|
|
|
5
|
|
|
0
|
|
|
|
|
0
|
|
811
|
6
|
100
|
|
|
|
27
|
if ( $_ == 4 ) { return ( 'Thursday' ); last SWITCH; } |
|
1
|
|
|
|
|
6
|
|
|
0
|
|
|
|
|
0
|
|
812
|
5
|
100
|
|
|
|
28
|
if ( $_ == 5 ) { return ( 'Friday' ); last SWITCH; } |
|
1
|
|
|
|
|
6
|
|
|
0
|
|
|
|
|
0
|
|
813
|
4
|
100
|
|
|
|
92
|
if ( $_ == 6 ) { return ( 'Saturday' ); last SWITCH; } |
|
2
|
|
|
|
|
185
|
|
|
0
|
|
|
|
|
0
|
|
814
|
2
|
|
|
|
|
12
|
return ( 'Sunday' ); |
815
|
|
|
|
|
|
|
} |
816
|
|
|
|
|
|
|
} |
817
|
|
|
|
|
|
|
} |
818
|
|
|
|
|
|
|
|
819
|
|
|
|
|
|
|
|
820
|
|
|
|
|
|
|
|
821
|
|
|
|
|
|
|
|
822
|
|
|
|
|
|
|
############################################################################### |
823
|
|
|
|
|
|
|
# Usage : set_month_to_month_name_abbrev( SCALAR ) |
824
|
|
|
|
|
|
|
# Purpose : set the incoming month to three letter abbreviation |
825
|
|
|
|
|
|
|
# Returns : three character abbreviated month name if successful |
826
|
|
|
|
|
|
|
# Parameters : month in one of three formats ( numeric<1-12>, full name or three character abbreviated ) |
827
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
828
|
|
|
|
|
|
|
# Comments : N/A |
829
|
|
|
|
|
|
|
# See Also : N/A |
830
|
|
|
|
|
|
|
############################################################################### |
831
|
|
|
|
|
|
|
sub set_month_to_month_name_abbrev |
832
|
|
|
|
|
|
|
{ |
833
|
|
|
|
|
|
|
my ( |
834
|
49
|
|
|
49
|
1
|
5438
|
$month_in_04, |
835
|
|
|
|
|
|
|
) |
836
|
|
|
|
|
|
|
= @_; |
837
|
|
|
|
|
|
|
|
838
|
|
|
|
|
|
|
|
839
|
|
|
|
|
|
|
# Incoming Inspection |
840
|
49
|
|
|
|
|
64
|
my $num_input_params_09 = 1; |
841
|
49
|
100
|
|
|
|
130
|
( @_ == $num_input_params_09) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly one parameter, a month number or month alpha. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
202
|
|
842
|
48
|
100
|
|
|
|
143
|
( ref(\$month_in_04) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month number or month alpha '$month_in_04'.\n\n\n"; |
|
2
|
|
|
|
|
274
|
|
843
|
46
|
100
|
|
|
|
118
|
( $month_in_04 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the month number or month alpha '$month_in_04'.\n\n\n"; |
|
1
|
|
|
|
|
145
|
|
844
|
|
|
|
|
|
|
|
845
|
45
|
100
|
|
|
|
234
|
if ( $month_in_04 =~ m/^(\d{1,2})$/i ) |
846
|
|
|
|
|
|
|
{ |
847
|
20
|
|
|
|
|
46
|
return ( month_number_to_month_name($month_in_04) ); |
848
|
|
|
|
|
|
|
} |
849
|
|
|
|
|
|
|
else |
850
|
|
|
|
|
|
|
{ |
851
|
25
|
|
|
|
|
54
|
return ( month_number_to_month_name(month_name_to_month_number($month_in_04)) ); |
852
|
|
|
|
|
|
|
} |
853
|
|
|
|
|
|
|
} |
854
|
|
|
|
|
|
|
|
855
|
|
|
|
|
|
|
|
856
|
|
|
|
|
|
|
|
857
|
|
|
|
|
|
|
|
858
|
|
|
|
|
|
|
############################################################################### |
859
|
|
|
|
|
|
|
# Usage : set_month_to_month_name_full( SCALAR ) |
860
|
|
|
|
|
|
|
# Purpose : set the incoming month to full name |
861
|
|
|
|
|
|
|
# Returns : month FULL name if successful |
862
|
|
|
|
|
|
|
# Parameters : month in one of three formats ( numeric<1-12>, full name or three character abbreviated ) |
863
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
864
|
|
|
|
|
|
|
# Comments : N/A |
865
|
|
|
|
|
|
|
# See Also : N/A |
866
|
|
|
|
|
|
|
############################################################################### |
867
|
|
|
|
|
|
|
sub set_month_to_month_name_full |
868
|
|
|
|
|
|
|
{ |
869
|
|
|
|
|
|
|
my ( |
870
|
25
|
|
|
25
|
1
|
6410
|
$month_in_07, |
871
|
|
|
|
|
|
|
) |
872
|
|
|
|
|
|
|
= @_; |
873
|
|
|
|
|
|
|
|
874
|
|
|
|
|
|
|
|
875
|
|
|
|
|
|
|
# Incoming Inspection |
876
|
25
|
|
|
|
|
40
|
my $num_input_params_34 = 1; |
877
|
25
|
100
|
|
|
|
68
|
( @_ == $num_input_params_34) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly ${num_input_params_34} parameter, a month number or month alpha. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
193
|
|
878
|
24
|
100
|
|
|
|
72
|
( ref(\$month_in_07) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month number or month alpha '$month_in_07'.\n\n\n"; |
|
2
|
|
|
|
|
259
|
|
879
|
22
|
100
|
|
|
|
65
|
( $month_in_07 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the month number or month alpha '$month_in_07'.\n\n\n"; |
|
1
|
|
|
|
|
135
|
|
880
|
21
|
100
|
|
|
|
49
|
( is_valid_month($month_in_07) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the month from the input month string '$month_in_07'.\n\n\n"; |
|
5
|
|
|
|
|
805
|
|
881
|
|
|
|
|
|
|
|
882
|
|
|
|
|
|
|
|
883
|
16
|
|
|
|
|
34
|
my $month_num_15 = set_month_to_month_number($month_in_07); |
884
|
16
|
|
|
|
|
33
|
foreach ($month_num_15) |
885
|
|
|
|
|
|
|
{ |
886
|
|
|
|
|
|
|
SWITCH: |
887
|
|
|
|
|
|
|
{ |
888
|
16
|
100
|
|
|
|
20
|
if ( $_ == 1 ) { return ( 'January' ); last SWITCH; } |
|
16
|
|
|
|
|
35
|
|
|
1
|
|
|
|
|
6
|
|
|
0
|
|
|
|
|
0
|
|
889
|
15
|
100
|
|
|
|
30
|
if ( $_ == 2 ) { return ( 'February' ); last SWITCH; } |
|
3
|
|
|
|
|
12
|
|
|
0
|
|
|
|
|
0
|
|
890
|
12
|
100
|
|
|
|
26
|
if ( $_ == 3 ) { return ( 'March' ); last SWITCH; } |
|
1
|
|
|
|
|
5
|
|
|
0
|
|
|
|
|
0
|
|
891
|
11
|
100
|
|
|
|
21
|
if ( $_ == 4 ) { return ( 'April' ); last SWITCH; } |
|
2
|
|
|
|
|
10
|
|
|
0
|
|
|
|
|
0
|
|
892
|
9
|
100
|
|
|
|
20
|
if ( $_ == 5 ) { return ( 'May' ); last SWITCH; } |
|
1
|
|
|
|
|
7
|
|
|
0
|
|
|
|
|
0
|
|
893
|
8
|
100
|
|
|
|
18
|
if ( $_ == 6 ) { return ( 'June' ); last SWITCH; } |
|
1
|
|
|
|
|
6
|
|
|
0
|
|
|
|
|
0
|
|
894
|
7
|
100
|
|
|
|
13
|
if ( $_ == 7 ) { return ( 'July' ); last SWITCH; } |
|
1
|
|
|
|
|
5
|
|
|
0
|
|
|
|
|
0
|
|
895
|
6
|
100
|
|
|
|
14
|
if ( $_ == 8 ) { return ( 'August' ); last SWITCH; } |
|
2
|
|
|
|
|
11
|
|
|
0
|
|
|
|
|
0
|
|
896
|
4
|
100
|
|
|
|
11
|
if ( $_ == 9 ) { return ( 'September' ); last SWITCH; } |
|
1
|
|
|
|
|
6
|
|
|
0
|
|
|
|
|
0
|
|
897
|
3
|
100
|
|
|
|
7
|
if ( $_ == 10 ) { return ( 'October' ); last SWITCH; } |
|
1
|
|
|
|
|
5
|
|
|
0
|
|
|
|
|
0
|
|
898
|
2
|
100
|
|
|
|
7
|
if ( $_ == 11 ) { return ( 'November' ); last SWITCH; } |
|
1
|
|
|
|
|
5
|
|
|
0
|
|
|
|
|
0
|
|
899
|
1
|
|
|
|
|
6
|
return ( 'December' ); |
900
|
|
|
|
|
|
|
} |
901
|
|
|
|
|
|
|
} |
902
|
|
|
|
|
|
|
} |
903
|
|
|
|
|
|
|
|
904
|
|
|
|
|
|
|
|
905
|
|
|
|
|
|
|
|
906
|
|
|
|
|
|
|
|
907
|
|
|
|
|
|
|
############################################################################### |
908
|
|
|
|
|
|
|
# Usage : set_day_to_day_number( SCALAR ) |
909
|
|
|
|
|
|
|
# Purpose : set the incoming day of week to day of week number |
910
|
|
|
|
|
|
|
# Returns : numeric<1-7> if successful |
911
|
|
|
|
|
|
|
# Parameters : day of week in one of three formats ( numeric<1-7>, full name or three character abbreviated ) |
912
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
913
|
|
|
|
|
|
|
# Comments : <1 for Mon ... 7 for Sun> |
914
|
|
|
|
|
|
|
# See Also : N/A |
915
|
|
|
|
|
|
|
############################################################################### |
916
|
|
|
|
|
|
|
sub set_day_to_day_number |
917
|
|
|
|
|
|
|
{ |
918
|
|
|
|
|
|
|
my ( |
919
|
239854
|
|
|
239854
|
1
|
735470
|
$day_in_05, |
920
|
|
|
|
|
|
|
) |
921
|
|
|
|
|
|
|
= @_; |
922
|
|
|
|
|
|
|
|
923
|
|
|
|
|
|
|
|
924
|
|
|
|
|
|
|
# Incoming Inspection |
925
|
239854
|
|
|
|
|
1300304
|
my $num_input_params_10 = 1; |
926
|
239854
|
100
|
|
|
|
631223
|
( @_ == $num_input_params_10) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly one parameter, a day number or day alpha. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
198
|
|
927
|
239853
|
100
|
|
|
|
636853
|
( ref(\$day_in_05) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day number or day alpha '$day_in_05'.\n\n\n"; |
|
2
|
|
|
|
|
301
|
|
928
|
239851
|
100
|
|
|
|
623319
|
( $day_in_05 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the day number or day alpha '$day_in_05'.\n\n\n"; |
|
1
|
|
|
|
|
137
|
|
929
|
|
|
|
|
|
|
|
930
|
239850
|
100
|
|
|
|
817961
|
if ( !( $day_in_05 =~ m/^(\d{1,2})$/i ) ) |
931
|
|
|
|
|
|
|
{ |
932
|
640
|
|
|
|
|
1348
|
return ( day_name_to_day_number($day_in_05) ); |
933
|
|
|
|
|
|
|
} |
934
|
|
|
|
|
|
|
else |
935
|
|
|
|
|
|
|
{ |
936
|
239210
|
|
|
|
|
484705
|
return ( day_name_to_day_number(day_number_to_day_name($day_in_05)) ); |
937
|
|
|
|
|
|
|
} |
938
|
|
|
|
|
|
|
} |
939
|
|
|
|
|
|
|
|
940
|
|
|
|
|
|
|
|
941
|
|
|
|
|
|
|
|
942
|
|
|
|
|
|
|
|
943
|
|
|
|
|
|
|
############################################################################### |
944
|
|
|
|
|
|
|
# Usage : set_month_to_month_number( SCALAR ) |
945
|
|
|
|
|
|
|
# Purpose : set the incoming month to month number |
946
|
|
|
|
|
|
|
# Returns : numeric month <1-12> if successful |
947
|
|
|
|
|
|
|
# Parameters : month in one of three formats ( numeric<1-12>, full name or three character abbreviated ) |
948
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
949
|
|
|
|
|
|
|
# Comments : N/A |
950
|
|
|
|
|
|
|
# See Also : N/A |
951
|
|
|
|
|
|
|
############################################################################### |
952
|
|
|
|
|
|
|
sub set_month_to_month_number |
953
|
|
|
|
|
|
|
{ |
954
|
|
|
|
|
|
|
my ( |
955
|
283481
|
|
|
283481
|
1
|
461076
|
$month_in_06, |
956
|
|
|
|
|
|
|
) |
957
|
|
|
|
|
|
|
= @_; |
958
|
|
|
|
|
|
|
|
959
|
|
|
|
|
|
|
|
960
|
|
|
|
|
|
|
# Incoming Inspection |
961
|
283481
|
|
|
|
|
372010
|
my $num_input_params_11 = 1; |
962
|
283481
|
100
|
|
|
|
654467
|
( @_ == $num_input_params_11) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly one parameter, a month number or month alpha. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
189
|
|
963
|
283480
|
100
|
|
|
|
711313
|
( ref(\$month_in_06) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month number or month alpha '$month_in_06'.\n\n\n"; |
|
2
|
|
|
|
|
238
|
|
964
|
283478
|
100
|
|
|
|
621622
|
( $month_in_06 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the month number or month alpha '$month_in_06'.\n\n\n"; |
|
1
|
|
|
|
|
128
|
|
965
|
|
|
|
|
|
|
|
966
|
283477
|
100
|
|
|
|
891099
|
if ( !( $month_in_06 =~ m/^(\d{1,2})$/i ) ) |
967
|
|
|
|
|
|
|
{ |
968
|
3301
|
|
|
|
|
6171
|
return ( month_name_to_month_number($month_in_06) ); |
969
|
|
|
|
|
|
|
} |
970
|
|
|
|
|
|
|
else |
971
|
|
|
|
|
|
|
{ |
972
|
280176
|
|
|
|
|
599261
|
return ( month_name_to_month_number(month_number_to_month_name($month_in_06)) ); |
973
|
|
|
|
|
|
|
} |
974
|
|
|
|
|
|
|
} |
975
|
|
|
|
|
|
|
|
976
|
|
|
|
|
|
|
|
977
|
|
|
|
|
|
|
|
978
|
|
|
|
|
|
|
|
979
|
|
|
|
|
|
|
############################################################################### |
980
|
|
|
|
|
|
|
# Usage : get_num_days_in_year( SCALAR ) |
981
|
|
|
|
|
|
|
# Purpose : determine number of days in given year |
982
|
|
|
|
|
|
|
# Returns : - '366' if the input is a leap year |
983
|
|
|
|
|
|
|
# : - '365' if the input is a NON leap year |
984
|
|
|
|
|
|
|
# Parameters : ( |
985
|
|
|
|
|
|
|
# : year in integer form |
986
|
|
|
|
|
|
|
# : ) |
987
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
988
|
|
|
|
|
|
|
# Comments : Handles all years, even negative years (aka BC) |
989
|
|
|
|
|
|
|
# See Also : N/A |
990
|
|
|
|
|
|
|
############################################################################### |
991
|
|
|
|
|
|
|
sub get_num_days_in_year |
992
|
|
|
|
|
|
|
{ |
993
|
|
|
|
|
|
|
my ( |
994
|
144159
|
|
|
144159
|
1
|
187418
|
$year_in_03, |
995
|
|
|
|
|
|
|
) |
996
|
|
|
|
|
|
|
= @_; |
997
|
|
|
|
|
|
|
|
998
|
|
|
|
|
|
|
|
999
|
|
|
|
|
|
|
# Incoming Inspection |
1000
|
144159
|
|
|
|
|
196312
|
my $num_input_params_04 = 1; |
1001
|
144159
|
100
|
|
|
|
320931
|
( @_ == $num_input_params_04) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly one parameter, a year number. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
206
|
|
1002
|
144158
|
100
|
|
|
|
368115
|
( ref(\$year_in_03) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year '$year_in_03'.\n\n\n"; |
|
2
|
|
|
|
|
262
|
|
1003
|
144156
|
100
|
|
|
|
345552
|
( $year_in_03 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the year '$year_in_03'.\n\n\n"; |
|
1
|
|
|
|
|
135
|
|
1004
|
144155
|
100
|
|
|
|
490575
|
( $year_in_03 =~ m/^\-{0,1}\d+$/ ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a number for the year '$year_in_03'.\n\n\n"; |
|
3
|
|
|
|
|
4574
|
|
1005
|
|
|
|
|
|
|
|
1006
|
144152
|
100
|
|
|
|
264982
|
if ( is_leap_year($year_in_03) ne '' ) |
1007
|
|
|
|
|
|
|
{ |
1008
|
35135
|
|
|
|
|
111128
|
return ( 366 ); |
1009
|
|
|
|
|
|
|
} |
1010
|
|
|
|
|
|
|
else |
1011
|
|
|
|
|
|
|
{ |
1012
|
109017
|
|
|
|
|
313098
|
return ( 365 ); |
1013
|
|
|
|
|
|
|
} |
1014
|
|
|
|
|
|
|
} |
1015
|
|
|
|
|
|
|
|
1016
|
|
|
|
|
|
|
|
1017
|
|
|
|
|
|
|
|
1018
|
|
|
|
|
|
|
|
1019
|
|
|
|
|
|
|
############################################################################### |
1020
|
|
|
|
|
|
|
# Usage : date1_to_date2_delta( SCALAR, SCALAR ) |
1021
|
|
|
|
|
|
|
# Purpose : finds the difference in days between the two dates by subtracting the second from the first |
1022
|
|
|
|
|
|
|
# Returns : integer day count if successful |
1023
|
|
|
|
|
|
|
# Parameters : ( |
1024
|
|
|
|
|
|
|
# : date ONE in any format, |
1025
|
|
|
|
|
|
|
# : date TWO in any format |
1026
|
|
|
|
|
|
|
# : ) |
1027
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
1028
|
|
|
|
|
|
|
# Comments : if day ONE is EARLIER than date TWO, a negative number is returned |
1029
|
|
|
|
|
|
|
# See Also : N/A |
1030
|
|
|
|
|
|
|
############################################################################### |
1031
|
|
|
|
|
|
|
sub date1_to_date2_delta |
1032
|
|
|
|
|
|
|
{ |
1033
|
|
|
|
|
|
|
my ( |
1034
|
143
|
|
|
143
|
1
|
9274
|
$date_one_00, |
1035
|
|
|
|
|
|
|
$date_two_00 |
1036
|
|
|
|
|
|
|
) |
1037
|
|
|
|
|
|
|
= @_; |
1038
|
|
|
|
|
|
|
|
1039
|
|
|
|
|
|
|
|
1040
|
|
|
|
|
|
|
# Incoming Inspection |
1041
|
143
|
|
|
|
|
278
|
my $num_input_params_12 = 2; |
1042
|
143
|
100
|
|
|
|
504
|
( @_ == $num_input_params_12) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_12 parameters ('date1' and date2). '@_'.\n\n\n"; |
|
8
|
|
|
|
|
1260
|
|
1043
|
|
|
|
|
|
|
|
1044
|
135
|
100
|
|
|
|
817
|
( ref(\$date_one_00) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR first parameter for the first date '$date_one_00'.\n\n\n"; |
|
1
|
|
|
|
|
148
|
|
1045
|
134
|
100
|
|
|
|
520
|
( ref(\$date_two_00) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR second parameter for the second date '$date_two_00'.\n\n\n"; |
|
1
|
|
|
|
|
141
|
|
1046
|
|
|
|
|
|
|
|
1047
|
133
|
100
|
|
|
|
553
|
( $date_one_00 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the first date '$date_one_00'.\n\n\n"; |
|
1
|
|
|
|
|
141
|
|
1048
|
132
|
100
|
|
|
|
343
|
( $date_two_00 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the second date '$date_two_00'.\n\n\n"; |
|
1
|
|
|
|
|
218
|
|
1049
|
|
|
|
|
|
|
|
1050
|
131
|
100
|
|
|
|
358
|
( date_only_parse($date_one_00) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the date from the input date1 string '$date_one_00'.\n\n\n"; |
|
1
|
|
|
|
|
147
|
|
1051
|
130
|
100
|
|
|
|
561
|
( date_only_parse($date_two_00) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the date from the input date2 string '$date_two_00'.\n\n\n"; |
|
1
|
|
|
|
|
158
|
|
1052
|
|
|
|
|
|
|
|
1053
|
129
|
|
|
|
|
275
|
my $date_one_02; |
1054
|
|
|
|
|
|
|
my $date_two_02; |
1055
|
129
|
|
|
|
|
492
|
my $date_compare_00 = compare_date1_and_date2($date_one_00, $date_two_00); |
1056
|
|
|
|
|
|
|
|
1057
|
129
|
50
|
100
|
|
|
998
|
if ( ( $date_compare_00 ne '0' ) && ( $date_compare_00 ne '-1' ) && ( $date_compare_00 ne '1' ) ) |
|
|
|
66
|
|
|
|
|
1058
|
|
|
|
|
|
|
{ |
1059
|
0
|
|
|
|
|
0
|
croak "\n\n ($0) '${\(caller(0))[3]}' This condition should NOT occur. date_compare_00 has a value of '$date_compare_00' and only one of '1', '-1' or '0' is expected.\n\n\n"; |
|
0
|
|
|
|
|
0
|
|
1060
|
|
|
|
|
|
|
} |
1061
|
|
|
|
|
|
|
|
1062
|
|
|
|
|
|
|
|
1063
|
129
|
100
|
|
|
|
308
|
if ( $date_compare_00 eq '0' ) |
1064
|
|
|
|
|
|
|
{ |
1065
|
4
|
|
|
|
|
23
|
return ('0'); |
1066
|
|
|
|
|
|
|
} |
1067
|
125
|
100
|
|
|
|
386
|
if ( $date_compare_00 eq '-1' ) |
1068
|
|
|
|
|
|
|
{ |
1069
|
57
|
|
|
|
|
95
|
$date_one_02 = $date_two_00; |
1070
|
57
|
|
|
|
|
86
|
$date_two_02 = $date_one_00; |
1071
|
|
|
|
|
|
|
} |
1072
|
125
|
100
|
|
|
|
300
|
if ( $date_compare_00 eq '1' ) |
1073
|
|
|
|
|
|
|
{ |
1074
|
68
|
|
|
|
|
103
|
$date_one_02 = $date_one_00; |
1075
|
68
|
|
|
|
|
103
|
$date_two_02 = $date_two_00; |
1076
|
|
|
|
|
|
|
} |
1077
|
|
|
|
|
|
|
|
1078
|
|
|
|
|
|
|
|
1079
|
125
|
|
|
|
|
288
|
my ( $date1_month_num_02, $date1_day_of_month_02, $date1_year_num_02, $date1_day_of_week_02 ) = date_only_parse($date_one_02); |
1080
|
125
|
|
|
|
|
391
|
my ( $date2_month_num_02, $date2_day_of_month_02, $date2_year_num_02, $date2_day_of_week_02 ) = date_only_parse($date_two_02); |
1081
|
|
|
|
|
|
|
|
1082
|
|
|
|
|
|
|
|
1083
|
125
|
|
|
|
|
322
|
my $year_phase_date_one_00; |
1084
|
|
|
|
|
|
|
my $which_400yr_cycle_occurrence_for_date_one_02; |
1085
|
125
|
100
|
|
|
|
653
|
if ( $date1_year_num_02 >= 0 ) |
1086
|
|
|
|
|
|
|
{ |
1087
|
108
|
|
|
|
|
417
|
$which_400yr_cycle_occurrence_for_date_one_02 = int( $date1_year_num_02 / $NUMBER_OF_YEAR_PHASES ); |
1088
|
108
|
|
|
|
|
783
|
$year_phase_date_one_00 = get_year_phase( $date1_year_num_02 ); |
1089
|
|
|
|
|
|
|
} |
1090
|
|
|
|
|
|
|
else |
1091
|
|
|
|
|
|
|
{ |
1092
|
17
|
|
|
|
|
109
|
$which_400yr_cycle_occurrence_for_date_one_02 = int( ($date1_year_num_02+1) / $NUMBER_OF_YEAR_PHASES ) - 1; |
1093
|
17
|
|
|
|
|
127
|
$year_phase_date_one_00 = $NUMBER_OF_YEAR_PHASES - ( -$date1_year_num_02 % $NUMBER_OF_YEAR_PHASES ); |
1094
|
17
|
100
|
|
|
|
132
|
if ( $year_phase_date_one_00 >= $NUMBER_OF_YEAR_PHASES ) |
1095
|
|
|
|
|
|
|
{ |
1096
|
2
|
|
|
|
|
17
|
$year_phase_date_one_00 -= $NUMBER_OF_YEAR_PHASES; |
1097
|
|
|
|
|
|
|
} |
1098
|
|
|
|
|
|
|
} |
1099
|
|
|
|
|
|
|
|
1100
|
125
|
|
|
|
|
332
|
my $year_phase_date_two; |
1101
|
|
|
|
|
|
|
my $which_400yr_cycle_occurrence_for_date_two_02; |
1102
|
125
|
100
|
|
|
|
333
|
if ( $date2_year_num_02 >= 0 ) |
1103
|
|
|
|
|
|
|
{ |
1104
|
81
|
|
|
|
|
237
|
$which_400yr_cycle_occurrence_for_date_two_02 = int( $date2_year_num_02 / $NUMBER_OF_YEAR_PHASES ); |
1105
|
81
|
|
|
|
|
444
|
$year_phase_date_two = get_year_phase( $date2_year_num_02 ); |
1106
|
|
|
|
|
|
|
} |
1107
|
|
|
|
|
|
|
else |
1108
|
|
|
|
|
|
|
{ |
1109
|
44
|
|
|
|
|
160
|
$which_400yr_cycle_occurrence_for_date_two_02 = int( ($date2_year_num_02+1) / $NUMBER_OF_YEAR_PHASES ) - 1; |
1110
|
44
|
|
|
|
|
266
|
$year_phase_date_two = $NUMBER_OF_YEAR_PHASES - ( -$date2_year_num_02 % $NUMBER_OF_YEAR_PHASES ); |
1111
|
44
|
100
|
|
|
|
314
|
if ( $year_phase_date_two >= $NUMBER_OF_YEAR_PHASES ) |
1112
|
|
|
|
|
|
|
{ |
1113
|
6
|
|
|
|
|
39
|
$year_phase_date_two -= $NUMBER_OF_YEAR_PHASES; |
1114
|
|
|
|
|
|
|
} |
1115
|
|
|
|
|
|
|
} |
1116
|
|
|
|
|
|
|
|
1117
|
|
|
|
|
|
|
|
1118
|
125
|
|
|
|
|
461
|
my $num_days_in_year1_phases_00 = 0; |
1119
|
125
|
|
|
|
|
406
|
for ( my $iii_005=0; $iii_005<$year_phase_date_one_00; $iii_005++ ) |
1120
|
|
|
|
|
|
|
{ |
1121
|
16184
|
|
|
|
|
33075
|
$num_days_in_year1_phases_00 += get_num_days_in_year( 2000 + $iii_005 ); # sum the days of whole years |
1122
|
|
|
|
|
|
|
} |
1123
|
125
|
|
|
|
|
372
|
$num_days_in_year1_phases_00 += number_of_day_within_year( $date_one_02 ); # sum the days of the year up to the given day |
1124
|
|
|
|
|
|
|
|
1125
|
|
|
|
|
|
|
|
1126
|
125
|
|
|
|
|
222
|
my $num_days_in_year2_phases = 0; |
1127
|
125
|
|
|
|
|
423
|
for ( my $iii_006=0; $iii_006<$year_phase_date_two; $iii_006++ ) |
1128
|
|
|
|
|
|
|
{ |
1129
|
16766
|
|
|
|
|
39405
|
$num_days_in_year2_phases += get_num_days_in_year( 2000 + $iii_006 ); # sum the days of whole years |
1130
|
|
|
|
|
|
|
} |
1131
|
125
|
|
|
|
|
361
|
$num_days_in_year2_phases += number_of_day_within_year( $date_two_02 ); # sum the days of the year up to the given day |
1132
|
|
|
|
|
|
|
|
1133
|
|
|
|
|
|
|
|
1134
|
125
|
|
|
|
|
265
|
my $date_diff_00 = ''; |
1135
|
125
|
100
|
|
|
|
397
|
if ( $which_400yr_cycle_occurrence_for_date_one_02 == $which_400yr_cycle_occurrence_for_date_two_02 ) |
|
|
100
|
|
|
|
|
|
1136
|
|
|
|
|
|
|
{ |
1137
|
70
|
|
|
|
|
115
|
$date_diff_00 = $num_days_in_year1_phases_00 - $num_days_in_year2_phases; |
1138
|
|
|
|
|
|
|
} |
1139
|
|
|
|
|
|
|
elsif ( $which_400yr_cycle_occurrence_for_date_one_02 == ( $which_400yr_cycle_occurrence_for_date_two_02 + 1 ) ) |
1140
|
|
|
|
|
|
|
{ |
1141
|
22
|
|
|
|
|
108
|
$date_diff_00 = $num_days_in_year1_phases_00 + ( $NUMBER_OF_DAYS_IN_400_YEAR_CYCLE - $num_days_in_year2_phases ); |
1142
|
|
|
|
|
|
|
} |
1143
|
|
|
|
|
|
|
# elsif ( $which_400yr_cycle_occurrence_for_date_one_02 > ( $which_400yr_cycle_occurrence_for_date_two_02 + 1 ) ) |
1144
|
|
|
|
|
|
|
else |
1145
|
|
|
|
|
|
|
{ |
1146
|
33
|
|
|
|
|
350
|
$date_diff_00 = ($which_400yr_cycle_occurrence_for_date_one_02 - ($which_400yr_cycle_occurrence_for_date_two_02 + 1 )) * ( $NUMBER_OF_DAYS_IN_400_YEAR_CYCLE); |
1147
|
33
|
|
|
|
|
231
|
$date_diff_00 += $num_days_in_year1_phases_00 + ( $NUMBER_OF_DAYS_IN_400_YEAR_CYCLE - $num_days_in_year2_phases ); |
1148
|
|
|
|
|
|
|
} |
1149
|
|
|
|
|
|
|
|
1150
|
|
|
|
|
|
|
|
1151
|
125
|
100
|
|
|
|
590
|
if ( $date_compare_00 == 1 ) |
1152
|
|
|
|
|
|
|
{ |
1153
|
68
|
|
|
|
|
641
|
return ( $date_diff_00 ); |
1154
|
|
|
|
|
|
|
} |
1155
|
|
|
|
|
|
|
else |
1156
|
|
|
|
|
|
|
{ |
1157
|
57
|
|
|
|
|
541
|
return ( -$date_diff_00 ); |
1158
|
|
|
|
|
|
|
} |
1159
|
|
|
|
|
|
|
} |
1160
|
|
|
|
|
|
|
|
1161
|
|
|
|
|
|
|
|
1162
|
|
|
|
|
|
|
|
1163
|
|
|
|
|
|
|
|
1164
|
|
|
|
|
|
|
############################################################################### |
1165
|
|
|
|
|
|
|
# Usage : is_valid_month( SCALAR ) |
1166
|
|
|
|
|
|
|
# Purpose : checks if month is valid |
1167
|
|
|
|
|
|
|
# Returns : - '1' if month is valid |
1168
|
|
|
|
|
|
|
# : - '' otherwise |
1169
|
|
|
|
|
|
|
# Parameters : ( |
1170
|
|
|
|
|
|
|
# : alpha or month integer<1-12>, |
1171
|
|
|
|
|
|
|
# : ) |
1172
|
|
|
|
|
|
|
# Throws : No Exceptions |
1173
|
|
|
|
|
|
|
# Comments : N/A |
1174
|
|
|
|
|
|
|
# See Also : N/A |
1175
|
|
|
|
|
|
|
############################################################################### |
1176
|
|
|
|
|
|
|
sub is_valid_month |
1177
|
|
|
|
|
|
|
{ |
1178
|
|
|
|
|
|
|
my ( |
1179
|
563575
|
|
|
563575
|
1
|
858460
|
$month_input_01, |
1180
|
|
|
|
|
|
|
) |
1181
|
|
|
|
|
|
|
= @_; |
1182
|
|
|
|
|
|
|
|
1183
|
|
|
|
|
|
|
|
1184
|
|
|
|
|
|
|
# Incoming Inspection |
1185
|
563575
|
100
|
|
|
|
1233584
|
if ( @_ != 1 ) |
1186
|
|
|
|
|
|
|
{ |
1187
|
2
|
|
|
|
|
10
|
return ( '' ); |
1188
|
|
|
|
|
|
|
} |
1189
|
|
|
|
|
|
|
|
1190
|
563573
|
100
|
|
|
|
1397754
|
if ( ref(\$month_input_01) ne 'SCALAR' ) |
1191
|
|
|
|
|
|
|
{ |
1192
|
2
|
|
|
|
|
8
|
return ( '' ); |
1193
|
|
|
|
|
|
|
} |
1194
|
|
|
|
|
|
|
|
1195
|
563571
|
100
|
|
|
|
1223524
|
if ( $month_input_01 eq '' ) |
1196
|
|
|
|
|
|
|
{ |
1197
|
1
|
|
|
|
|
5
|
return ( '' ); |
1198
|
|
|
|
|
|
|
} |
1199
|
|
|
|
|
|
|
|
1200
|
|
|
|
|
|
|
|
1201
|
|
|
|
|
|
|
# Check for expected strings |
1202
|
563570
|
100
|
|
|
|
2156517
|
if ( !( $month_input_01 =~ m/^(\d{1,2}|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|January|February|March|April|May|June|July|August|September|October|November|December)$/i ) ) |
1203
|
|
|
|
|
|
|
{ |
1204
|
51
|
|
|
|
|
256
|
return ( '' ); |
1205
|
|
|
|
|
|
|
} |
1206
|
|
|
|
|
|
|
|
1207
|
|
|
|
|
|
|
|
1208
|
|
|
|
|
|
|
# Check numeric form of Month of Year for acceptable value |
1209
|
563519
|
100
|
|
|
|
1625387
|
if ( $month_input_01 =~ m/^(\d{1,2})$/ ) |
1210
|
|
|
|
|
|
|
{ |
1211
|
277238
|
100
|
100
|
|
|
1652890
|
if ( ( $1 < 1 ) || ( $1 > 12 ) ) |
1212
|
|
|
|
|
|
|
{ |
1213
|
33
|
|
|
|
|
166
|
return ( '' ); |
1214
|
|
|
|
|
|
|
} |
1215
|
|
|
|
|
|
|
} |
1216
|
|
|
|
|
|
|
|
1217
|
563486
|
|
|
|
|
1581512
|
return ( 1 ); |
1218
|
|
|
|
|
|
|
} |
1219
|
|
|
|
|
|
|
|
1220
|
|
|
|
|
|
|
|
1221
|
|
|
|
|
|
|
|
1222
|
|
|
|
|
|
|
|
1223
|
|
|
|
|
|
|
############################################################################### |
1224
|
|
|
|
|
|
|
# Usage : is_valid_day_of_month( SCALAR, SCALAR, SCALAR ) |
1225
|
|
|
|
|
|
|
# Purpose : checks if day of month is valid |
1226
|
|
|
|
|
|
|
# Returns : - '1' if day of month is valid |
1227
|
|
|
|
|
|
|
# : - '' otherwise |
1228
|
|
|
|
|
|
|
# Parameters : ( |
1229
|
|
|
|
|
|
|
# : alpha or month integer<1-12>, |
1230
|
|
|
|
|
|
|
# : day of month integer<1-N>, |
1231
|
|
|
|
|
|
|
# : year integer, |
1232
|
|
|
|
|
|
|
# : ) |
1233
|
|
|
|
|
|
|
# Throws : No Exceptions |
1234
|
|
|
|
|
|
|
# Comments : Handles all years, even negative years (aka BC) |
1235
|
|
|
|
|
|
|
# See Also : N/A |
1236
|
|
|
|
|
|
|
############################################################################### |
1237
|
|
|
|
|
|
|
sub is_valid_day_of_month |
1238
|
|
|
|
|
|
|
{ |
1239
|
|
|
|
|
|
|
my ( |
1240
|
22981
|
|
|
22981
|
1
|
53451
|
$month_input_02, |
1241
|
|
|
|
|
|
|
$day_of_month_input_00, |
1242
|
|
|
|
|
|
|
$year_input_01, |
1243
|
|
|
|
|
|
|
) |
1244
|
|
|
|
|
|
|
= @_; |
1245
|
|
|
|
|
|
|
|
1246
|
|
|
|
|
|
|
|
1247
|
|
|
|
|
|
|
# Incoming Inspection |
1248
|
22981
|
100
|
|
|
|
47854
|
if ( @_ != 3 ) |
1249
|
|
|
|
|
|
|
{ |
1250
|
25
|
|
|
|
|
102
|
return ( '' ); |
1251
|
|
|
|
|
|
|
} |
1252
|
|
|
|
|
|
|
|
1253
|
22956
|
100
|
|
|
|
55127
|
if ( ref(\$day_of_month_input_00) ne 'SCALAR' ) |
1254
|
|
|
|
|
|
|
{ |
1255
|
1
|
|
|
|
|
5
|
return ( '' ); |
1256
|
|
|
|
|
|
|
} |
1257
|
|
|
|
|
|
|
|
1258
|
22955
|
100
|
|
|
|
46451
|
if ( $day_of_month_input_00 eq '' ) |
1259
|
|
|
|
|
|
|
{ |
1260
|
1
|
|
|
|
|
5
|
return ( '' ); |
1261
|
|
|
|
|
|
|
} |
1262
|
|
|
|
|
|
|
|
1263
|
22954
|
100
|
|
|
|
55886
|
if ( !(is_valid_month($month_input_02)) ) |
1264
|
|
|
|
|
|
|
{ |
1265
|
4
|
|
|
|
|
32
|
return ( '' ); |
1266
|
|
|
|
|
|
|
} |
1267
|
22950
|
|
|
|
|
50211
|
my $month_num_03 = set_month_to_month_number($month_input_02); |
1268
|
|
|
|
|
|
|
|
1269
|
22950
|
100
|
|
|
|
48848
|
if ( !(is_valid_year($year_input_01)) ) |
1270
|
|
|
|
|
|
|
{ |
1271
|
1
|
|
|
|
|
5
|
return ( '' ); |
1272
|
|
|
|
|
|
|
} |
1273
|
|
|
|
|
|
|
|
1274
|
|
|
|
|
|
|
|
1275
|
22949
|
100
|
100
|
|
|
221220
|
if ( !( ( $day_of_month_input_00 =~ m/^(\d{1,2})$/ ) && ( $1 > 0 ) && ( $1 < 32 ) ) ) |
|
|
|
100
|
|
|
|
|
1276
|
|
|
|
|
|
|
{ |
1277
|
52
|
|
|
|
|
233
|
return ( '' ); |
1278
|
|
|
|
|
|
|
} |
1279
|
|
|
|
|
|
|
|
1280
|
|
|
|
|
|
|
|
1281
|
|
|
|
|
|
|
# Check for out of range day_of_month numbers |
1282
|
|
|
|
|
|
|
# Months with 30 days ( April June September November ) |
1283
|
22897
|
100
|
100
|
|
|
188370
|
if ( ( ( $month_num_03 == 4 ) || ( $month_num_03 == 6 ) || ( $month_num_03 == 9 ) || ( $month_num_03 == 11 ) ) && ( $day_of_month_input_00 > 30 ) ) |
|
|
|
100
|
|
|
|
|
1284
|
|
|
|
|
|
|
{ |
1285
|
14
|
|
|
|
|
65
|
return ( '' ); |
1286
|
|
|
|
|
|
|
} |
1287
|
|
|
|
|
|
|
# February (NON leap year) |
1288
|
|
|
|
|
|
|
# elsif ( ( $month_num_03 == 2 ) && (!( is_leap_year($year_input_01) )) && ( $day_of_month_input_00 > 28 ) ) |
1289
|
22883
|
100
|
100
|
|
|
56732
|
if ( ( $month_num_03 == 2 ) && (!( is_leap_year($year_input_01) )) && ( $day_of_month_input_00 > 28 ) ) |
|
|
|
100
|
|
|
|
|
1290
|
|
|
|
|
|
|
{ |
1291
|
18
|
|
|
|
|
80
|
return ( '' ); |
1292
|
|
|
|
|
|
|
} |
1293
|
|
|
|
|
|
|
# February (leap year) |
1294
|
|
|
|
|
|
|
# elsif ( ( $month_num_03 == 2 ) && ( is_leap_year($year_input_01) ) && ( $day_of_month_input_00 > 29 ) ) |
1295
|
22865
|
100
|
100
|
|
|
53409
|
if ( ( $month_num_03 == 2 ) && ( is_leap_year($year_input_01) ) && ( $day_of_month_input_00 > 29 ) ) |
|
|
|
100
|
|
|
|
|
1296
|
|
|
|
|
|
|
{ |
1297
|
7
|
|
|
|
|
36
|
return ( '' ); |
1298
|
|
|
|
|
|
|
} |
1299
|
|
|
|
|
|
|
# Months with 31 days |
1300
|
|
|
|
|
|
|
# elsif ( ( $month_num_03 > 0 ) && ( $month_num_03 < 13 ) && ( $day_of_month_input_00 > 31 ) ) |
1301
|
|
|
|
|
|
|
# { |
1302
|
|
|
|
|
|
|
# return ( '' ); |
1303
|
|
|
|
|
|
|
# } |
1304
|
|
|
|
|
|
|
|
1305
|
|
|
|
|
|
|
|
1306
|
22858
|
|
|
|
|
63588
|
return ( 1 ); |
1307
|
|
|
|
|
|
|
} |
1308
|
|
|
|
|
|
|
|
1309
|
|
|
|
|
|
|
|
1310
|
|
|
|
|
|
|
|
1311
|
|
|
|
|
|
|
|
1312
|
|
|
|
|
|
|
############################################################################### |
1313
|
|
|
|
|
|
|
# Usage : is_valid_day_of_week( SCALAR ) |
1314
|
|
|
|
|
|
|
# Purpose : checks if day of week is valid |
1315
|
|
|
|
|
|
|
# Returns : - '1' if day of week is valid |
1316
|
|
|
|
|
|
|
# : - '' otherwise |
1317
|
|
|
|
|
|
|
# Parameters : ( |
1318
|
|
|
|
|
|
|
# : day of week in one of three formats ( numeric<1-7>, full name or three character abbreviated ) |
1319
|
|
|
|
|
|
|
# : ) |
1320
|
|
|
|
|
|
|
# Throws : No Exceptions |
1321
|
|
|
|
|
|
|
# Comments : <1 for Mon ... 7 for Sun> |
1322
|
|
|
|
|
|
|
# See Also : N/A |
1323
|
|
|
|
|
|
|
############################################################################### |
1324
|
|
|
|
|
|
|
sub is_valid_day_of_week |
1325
|
|
|
|
|
|
|
{ |
1326
|
|
|
|
|
|
|
my ( |
1327
|
258939
|
|
|
258939
|
1
|
345352
|
$day_of_week_input_00, |
1328
|
|
|
|
|
|
|
) |
1329
|
|
|
|
|
|
|
= @_; |
1330
|
|
|
|
|
|
|
|
1331
|
|
|
|
|
|
|
|
1332
|
|
|
|
|
|
|
# Incoming Inspection |
1333
|
258939
|
100
|
|
|
|
538236
|
if ( @_ != 1 ) |
1334
|
|
|
|
|
|
|
{ |
1335
|
2
|
|
|
|
|
10
|
return ( '' ); |
1336
|
|
|
|
|
|
|
} |
1337
|
|
|
|
|
|
|
|
1338
|
258937
|
100
|
|
|
|
628464
|
if ( ref(\$day_of_week_input_00) ne 'SCALAR' ) |
1339
|
|
|
|
|
|
|
{ |
1340
|
2
|
|
|
|
|
8
|
return ( '' ); |
1341
|
|
|
|
|
|
|
} |
1342
|
|
|
|
|
|
|
|
1343
|
258935
|
100
|
|
|
|
529037
|
if ( $day_of_week_input_00 eq '' ) |
1344
|
|
|
|
|
|
|
{ |
1345
|
1
|
|
|
|
|
5
|
return ( '' ); |
1346
|
|
|
|
|
|
|
} |
1347
|
|
|
|
|
|
|
|
1348
|
|
|
|
|
|
|
|
1349
|
258934
|
100
|
|
|
|
936479
|
if ( !( $day_of_week_input_00 =~ m/^(\d|Mon|Tue|Wed|Thu|Fri|Sat|Sun|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)$/i ) ) |
1350
|
|
|
|
|
|
|
{ |
1351
|
21
|
|
|
|
|
118
|
return ( '' ); |
1352
|
|
|
|
|
|
|
} |
1353
|
|
|
|
|
|
|
|
1354
|
|
|
|
|
|
|
|
1355
|
|
|
|
|
|
|
# Check numeric form of day of week for valid value |
1356
|
258913
|
100
|
|
|
|
745553
|
if ( $day_of_week_input_00 =~ m/^(\d)$/ ) |
1357
|
|
|
|
|
|
|
{ |
1358
|
18397
|
100
|
100
|
|
|
127568
|
if ( ( $1 < 1 ) || ( $1 > 7 ) ) |
1359
|
|
|
|
|
|
|
{ |
1360
|
10
|
|
|
|
|
48
|
return ( '' ); |
1361
|
|
|
|
|
|
|
} |
1362
|
|
|
|
|
|
|
} |
1363
|
|
|
|
|
|
|
|
1364
|
258903
|
|
|
|
|
868002
|
return ( 1 ); |
1365
|
|
|
|
|
|
|
} |
1366
|
|
|
|
|
|
|
|
1367
|
|
|
|
|
|
|
|
1368
|
|
|
|
|
|
|
|
1369
|
|
|
|
|
|
|
|
1370
|
|
|
|
|
|
|
############################################################################### |
1371
|
|
|
|
|
|
|
# Usage : is_valid_year( SCALAR ) |
1372
|
|
|
|
|
|
|
# Purpose : checks if year is valid |
1373
|
|
|
|
|
|
|
# Returns : - '1' if year is valid |
1374
|
|
|
|
|
|
|
# : - '' otherwise |
1375
|
|
|
|
|
|
|
# Parameters : ( |
1376
|
|
|
|
|
|
|
# : year in integer format |
1377
|
|
|
|
|
|
|
# : ) |
1378
|
|
|
|
|
|
|
# Throws : No Exceptions |
1379
|
|
|
|
|
|
|
# Comments : Handles all years, even negative years (aka BC) |
1380
|
|
|
|
|
|
|
# See Also : N/A |
1381
|
|
|
|
|
|
|
############################################################################### |
1382
|
|
|
|
|
|
|
sub is_valid_year |
1383
|
|
|
|
|
|
|
{ |
1384
|
|
|
|
|
|
|
my ( |
1385
|
280190
|
|
|
280190
|
1
|
501772
|
$year_input_00, |
1386
|
|
|
|
|
|
|
) |
1387
|
|
|
|
|
|
|
= @_; |
1388
|
|
|
|
|
|
|
|
1389
|
|
|
|
|
|
|
|
1390
|
|
|
|
|
|
|
# Incoming Inspection |
1391
|
280190
|
100
|
|
|
|
617288
|
if ( @_ != 1 ) |
1392
|
|
|
|
|
|
|
{ |
1393
|
2
|
|
|
|
|
10
|
return ( '' ); |
1394
|
|
|
|
|
|
|
} |
1395
|
|
|
|
|
|
|
|
1396
|
280188
|
100
|
|
|
|
683321
|
if ( ref(\$year_input_00) ne 'SCALAR' ) |
1397
|
|
|
|
|
|
|
{ |
1398
|
2
|
|
|
|
|
10
|
return ( '' ); |
1399
|
|
|
|
|
|
|
} |
1400
|
|
|
|
|
|
|
|
1401
|
280186
|
100
|
|
|
|
590217
|
if ( $year_input_00 eq '' ) |
1402
|
|
|
|
|
|
|
{ |
1403
|
1
|
|
|
|
|
5
|
return ( '' ); |
1404
|
|
|
|
|
|
|
} |
1405
|
|
|
|
|
|
|
|
1406
|
280185
|
100
|
|
|
|
996120
|
if ( !( $year_input_00 =~ m/^\-{0,1}\d{1,}$/ ) ) |
1407
|
|
|
|
|
|
|
{ |
1408
|
31
|
|
|
|
|
166
|
return ( '' ); |
1409
|
|
|
|
|
|
|
} |
1410
|
|
|
|
|
|
|
|
1411
|
280154
|
|
|
|
|
776170
|
return ( 1 ); |
1412
|
|
|
|
|
|
|
} |
1413
|
|
|
|
|
|
|
|
1414
|
|
|
|
|
|
|
|
1415
|
|
|
|
|
|
|
|
1416
|
|
|
|
|
|
|
|
1417
|
|
|
|
|
|
|
############################################################################### |
1418
|
|
|
|
|
|
|
# Usage : is_valid_400_year_cycle( SCALAR ) |
1419
|
|
|
|
|
|
|
# Purpose : checks if year is valid 400 year cycle phase number |
1420
|
|
|
|
|
|
|
# Returns : - '1' if year is valid 400 year cycle phase number |
1421
|
|
|
|
|
|
|
# : - '' otherwise |
1422
|
|
|
|
|
|
|
# Parameters : ( |
1423
|
|
|
|
|
|
|
# : year in integer format |
1424
|
|
|
|
|
|
|
# : ) |
1425
|
|
|
|
|
|
|
# Throws : No Exceptions |
1426
|
|
|
|
|
|
|
# Comments : valid years are multiples of 400 (i.e. ... -400, 0, 400, ... 1600, 2000, 2400, ...) |
1427
|
|
|
|
|
|
|
# See Also : N/A |
1428
|
|
|
|
|
|
|
############################################################################### |
1429
|
|
|
|
|
|
|
sub is_valid_400_year_cycle |
1430
|
|
|
|
|
|
|
{ |
1431
|
|
|
|
|
|
|
my ( |
1432
|
124
|
|
|
124
|
1
|
2611
|
$four_hundred_year_cycle_01, |
1433
|
|
|
|
|
|
|
) |
1434
|
|
|
|
|
|
|
= @_; |
1435
|
|
|
|
|
|
|
|
1436
|
|
|
|
|
|
|
|
1437
|
|
|
|
|
|
|
# Incoming Inspection |
1438
|
124
|
100
|
|
|
|
353
|
if ( @_ != 1 ) |
1439
|
|
|
|
|
|
|
{ |
1440
|
2
|
|
|
|
|
9
|
return ( '' ); |
1441
|
|
|
|
|
|
|
} |
1442
|
|
|
|
|
|
|
|
1443
|
122
|
100
|
|
|
|
387
|
if ( ref(\$four_hundred_year_cycle_01) ne 'SCALAR' ) |
1444
|
|
|
|
|
|
|
{ |
1445
|
2
|
|
|
|
|
10
|
return ( '' ); |
1446
|
|
|
|
|
|
|
} |
1447
|
|
|
|
|
|
|
|
1448
|
120
|
100
|
|
|
|
285
|
if ( $four_hundred_year_cycle_01 eq '' ) |
1449
|
|
|
|
|
|
|
{ |
1450
|
1
|
|
|
|
|
7
|
return ( '' ); |
1451
|
|
|
|
|
|
|
} |
1452
|
|
|
|
|
|
|
|
1453
|
119
|
100
|
100
|
|
|
961
|
if ( !( ( $four_hundred_year_cycle_01 =~ m/^\-{0,1}(\d+)$/ ) && ( ( $1 % $NUMBER_OF_YEAR_PHASES ) == 0 ) ) ) |
1454
|
|
|
|
|
|
|
{ |
1455
|
15
|
|
|
|
|
148
|
return ( '' ); |
1456
|
|
|
|
|
|
|
} |
1457
|
|
|
|
|
|
|
|
1458
|
104
|
|
|
|
|
884
|
return ( 1 ); |
1459
|
|
|
|
|
|
|
} |
1460
|
|
|
|
|
|
|
|
1461
|
|
|
|
|
|
|
|
1462
|
|
|
|
|
|
|
|
1463
|
|
|
|
|
|
|
|
1464
|
|
|
|
|
|
|
############################################################################### |
1465
|
|
|
|
|
|
|
# Usage : compare_date1_and_date2( SCALAR, SCALAR ) |
1466
|
|
|
|
|
|
|
# Purpose : compares two dates to find which one is later |
1467
|
|
|
|
|
|
|
# Returns : - '1' if the FIRST date is LATER than the second |
1468
|
|
|
|
|
|
|
# : - '-1' if the FIRST date is EARLIER than the second |
1469
|
|
|
|
|
|
|
# : - '0' if both dates are the same |
1470
|
|
|
|
|
|
|
# Parameters : ( |
1471
|
|
|
|
|
|
|
# : date ONE in any format, |
1472
|
|
|
|
|
|
|
# : date TWO in any format |
1473
|
|
|
|
|
|
|
# : ) |
1474
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
1475
|
|
|
|
|
|
|
# Comments : N/A |
1476
|
|
|
|
|
|
|
# See Also : N/A |
1477
|
|
|
|
|
|
|
############################################################################### |
1478
|
|
|
|
|
|
|
sub compare_date1_and_date2 |
1479
|
|
|
|
|
|
|
{ |
1480
|
|
|
|
|
|
|
my ( |
1481
|
158
|
|
|
158
|
1
|
8473
|
$date_one_01, |
1482
|
|
|
|
|
|
|
$date_two_01 |
1483
|
|
|
|
|
|
|
) |
1484
|
|
|
|
|
|
|
= @_; |
1485
|
|
|
|
|
|
|
|
1486
|
|
|
|
|
|
|
|
1487
|
|
|
|
|
|
|
# Incoming Inspection |
1488
|
158
|
|
|
|
|
221
|
my $num_input_params_18 = 2; |
1489
|
158
|
100
|
|
|
|
458
|
( @_ == $num_input_params_18) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_18 parameter(s), two date strings. '@_'.\n\n\n"; |
|
7
|
|
|
|
|
961
|
|
1490
|
|
|
|
|
|
|
|
1491
|
151
|
100
|
|
|
|
534
|
( ref(\$date_one_01) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the first date string '$date_one_01'.\n\n\n"; |
|
1
|
|
|
|
|
129
|
|
1492
|
150
|
100
|
|
|
|
1097
|
( $date_one_01 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the first date string '$date_one_01'.\n\n\n"; |
|
1
|
|
|
|
|
146
|
|
1493
|
149
|
100
|
|
|
|
319
|
( date_only_parse($date_one_01) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot parse the date from the first input date string '$date_one_01'.\n\n\n"; |
|
1
|
|
|
|
|
163
|
|
1494
|
|
|
|
|
|
|
|
1495
|
148
|
100
|
|
|
|
513
|
( ref(\$date_two_01) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the second date string '$date_two_01'.\n\n\n"; |
|
1
|
|
|
|
|
196
|
|
1496
|
147
|
100
|
|
|
|
368
|
( $date_two_01 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the second date string '$date_two_01'.\n\n\n"; |
|
1
|
|
|
|
|
198
|
|
1497
|
146
|
100
|
|
|
|
325
|
( date_only_parse($date_two_01) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot parse the date from the second input date string '$date_two_01'.\n\n\n"; |
|
1
|
|
|
|
|
143
|
|
1498
|
|
|
|
|
|
|
|
1499
|
|
|
|
|
|
|
|
1500
|
|
|
|
|
|
|
|
1501
|
145
|
|
|
|
|
388
|
my ( $date1_month_num_03, $date1_day_of_month_03, $date1_year_num_03, $date1_day_of_week_03 ) = date_only_parse($date_one_01); |
1502
|
145
|
|
|
|
|
537
|
my ( $date2_month_num_03, $date2_day_of_month_03, $date2_year_num_03, $date2_day_of_week_03 ) = date_only_parse($date_two_01); |
1503
|
|
|
|
|
|
|
|
1504
|
|
|
|
|
|
|
|
1505
|
145
|
|
|
|
|
409
|
my $date1_month_num_04 = set_month_to_month_number($date1_month_num_03); |
1506
|
145
|
|
|
|
|
447
|
my $date2_month_num_04 = set_month_to_month_number($date2_month_num_03); |
1507
|
|
|
|
|
|
|
|
1508
|
145
|
|
|
|
|
271
|
my $compare_date_1_and_date_2_00 = ''; |
1509
|
145
|
100
|
100
|
|
|
1402
|
if ( $date1_year_num_03 > $date2_year_num_03 ) |
|
|
100
|
100
|
|
|
|
|
|
|
100
|
100
|
|
|
|
|
|
|
100
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
1510
|
|
|
|
|
|
|
{ |
1511
|
47
|
|
|
|
|
182
|
$compare_date_1_and_date_2_00 = '1'; |
1512
|
|
|
|
|
|
|
} |
1513
|
|
|
|
|
|
|
elsif ( ( $date1_year_num_03 == $date2_year_num_03 ) && ( $date1_month_num_04 > $date2_month_num_04 ) ) |
1514
|
|
|
|
|
|
|
{ |
1515
|
1
|
|
|
|
|
5
|
$compare_date_1_and_date_2_00 = '1'; |
1516
|
|
|
|
|
|
|
} |
1517
|
|
|
|
|
|
|
elsif ( ( $date1_year_num_03 == $date2_year_num_03 ) && ( $date1_month_num_04 == $date2_month_num_04 ) && ( $date1_day_of_month_03 > $date2_day_of_month_03 ) ) |
1518
|
|
|
|
|
|
|
{ |
1519
|
25
|
|
|
|
|
54
|
$compare_date_1_and_date_2_00 = '1'; |
1520
|
|
|
|
|
|
|
} |
1521
|
|
|
|
|
|
|
elsif ( ( $date1_year_num_03 == $date2_year_num_03 ) && ( $date1_month_num_04 == $date2_month_num_04 ) && ( $date1_day_of_month_03 == $date2_day_of_month_03 ) ) |
1522
|
|
|
|
|
|
|
{ |
1523
|
7
|
|
|
|
|
17
|
$compare_date_1_and_date_2_00 = '0'; |
1524
|
|
|
|
|
|
|
} |
1525
|
|
|
|
|
|
|
else |
1526
|
|
|
|
|
|
|
{ |
1527
|
65
|
|
|
|
|
136
|
$compare_date_1_and_date_2_00 = '-1'; |
1528
|
|
|
|
|
|
|
} |
1529
|
|
|
|
|
|
|
|
1530
|
145
|
|
|
|
|
497
|
return ( $compare_date_1_and_date_2_00 ); |
1531
|
|
|
|
|
|
|
} |
1532
|
|
|
|
|
|
|
|
1533
|
|
|
|
|
|
|
|
1534
|
|
|
|
|
|
|
|
1535
|
|
|
|
|
|
|
|
1536
|
|
|
|
|
|
|
############################################################################### |
1537
|
|
|
|
|
|
|
# Usage : date_offset_in_days( SCALAR, SCALAR ) |
1538
|
|
|
|
|
|
|
# Purpose : find a date in the future or past offset by the number of days from the given date |
1539
|
|
|
|
|
|
|
# Returns : - date of the day offset from the given date if successful |
1540
|
|
|
|
|
|
|
# Parameters : ( |
1541
|
|
|
|
|
|
|
# : date in any format, |
1542
|
|
|
|
|
|
|
# : number of days offset, positive is future date, negative is past date, zero is current date (no offset) |
1543
|
|
|
|
|
|
|
# : ) |
1544
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
1545
|
|
|
|
|
|
|
# Comments : N/A |
1546
|
|
|
|
|
|
|
# See Also : N/A |
1547
|
|
|
|
|
|
|
############################################################################### |
1548
|
|
|
|
|
|
|
sub date_offset_in_days |
1549
|
|
|
|
|
|
|
{ |
1550
|
|
|
|
|
|
|
my ( |
1551
|
106
|
|
|
106
|
1
|
37405
|
$date_in_01, |
1552
|
|
|
|
|
|
|
$date_delta_00 |
1553
|
|
|
|
|
|
|
) |
1554
|
|
|
|
|
|
|
= @_; |
1555
|
|
|
|
|
|
|
|
1556
|
|
|
|
|
|
|
|
1557
|
|
|
|
|
|
|
# Incoming Inspection |
1558
|
106
|
|
|
|
|
180
|
my $num_input_params_19 = 2; |
1559
|
106
|
100
|
|
|
|
347
|
( @_ == $num_input_params_19) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_19 parameter(s), a date string followed by the number of offset days. '@_'.\n\n\n"; |
|
6
|
|
|
|
|
925
|
|
1560
|
|
|
|
|
|
|
|
1561
|
100
|
100
|
|
|
|
353
|
( ref(\$date_in_01) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the date string '$date_in_01'.\n\n\n"; |
|
1
|
|
|
|
|
322
|
|
1562
|
99
|
100
|
|
|
|
287
|
( $date_in_01 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the date string '$date_in_01'.\n\n\n"; |
|
1
|
|
|
|
|
113
|
|
1563
|
98
|
100
|
|
|
|
238
|
( date_only_parse($date_in_01) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot parse the date from the input date string '$date_in_01'.\n\n\n"; |
|
2
|
|
|
|
|
444
|
|
1564
|
|
|
|
|
|
|
|
1565
|
96
|
100
|
|
|
|
424
|
( ref(\$date_delta_00) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the number of offset days '$date_delta_00'.\n\n\n"; |
|
1
|
|
|
|
|
194
|
|
1566
|
95
|
100
|
|
|
|
315
|
( $date_delta_00 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the number of offset days '$date_delta_00'.\n\n\n"; |
|
1
|
|
|
|
|
160
|
|
1567
|
94
|
100
|
|
|
|
530
|
( $date_delta_00 =~ m/^\-{0,1}\d+$/ ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the number of offset days '$date_delta_00'.\n\n\n"; |
|
1
|
|
|
|
|
336
|
|
1568
|
|
|
|
|
|
|
|
1569
|
|
|
|
|
|
|
|
1570
|
93
|
100
|
|
|
|
282
|
if ( $date_delta_00 == 0 ) |
1571
|
|
|
|
|
|
|
{ |
1572
|
6
|
|
|
|
|
24
|
return ( format_date( $date_in_01 ) ); |
1573
|
|
|
|
|
|
|
} |
1574
|
|
|
|
|
|
|
|
1575
|
|
|
|
|
|
|
|
1576
|
87
|
|
|
|
|
282
|
my ( $date1_month_num_05, $date1_day_of_month_05, $date1_year_num_05, $date1_day_of_week_05 ) = date_only_parse($date_in_01); |
1577
|
|
|
|
|
|
|
|
1578
|
|
|
|
|
|
|
# Total the number of 400 year cycles included in the offset day count |
1579
|
87
|
|
|
|
|
418
|
my $number_of_complete_year_cycles_00 = int( abs($date_delta_00) / $NUMBER_OF_DAYS_IN_400_YEAR_CYCLE ); |
1580
|
|
|
|
|
|
|
|
1581
|
|
|
|
|
|
|
# Day offset by multiples of COMPLETE four hundred year cycles |
1582
|
87
|
|
|
|
|
469
|
my $offset_year_00; |
1583
|
87
|
100
|
|
|
|
200
|
if ( $date_delta_00 >= 0 ) |
1584
|
|
|
|
|
|
|
{ |
1585
|
44
|
|
|
|
|
223
|
$offset_year_00 = $date1_year_num_05 + ( $number_of_complete_year_cycles_00 * $NUMBER_OF_YEAR_PHASES ); |
1586
|
|
|
|
|
|
|
} |
1587
|
|
|
|
|
|
|
else |
1588
|
|
|
|
|
|
|
{ |
1589
|
43
|
|
|
|
|
135
|
$offset_year_00 = $date1_year_num_05 - ( $number_of_complete_year_cycles_00 * $NUMBER_OF_YEAR_PHASES ); |
1590
|
|
|
|
|
|
|
} |
1591
|
87
|
|
|
|
|
425
|
my $offset_month_00 = $date1_month_num_05; |
1592
|
87
|
|
|
|
|
139
|
my $offset_day_of_month_00 = $date1_day_of_month_05; |
1593
|
|
|
|
|
|
|
|
1594
|
87
|
|
|
|
|
104
|
my $days_left_00; |
1595
|
87
|
|
|
|
|
368
|
my $days_left_in_offset_400_year_cycle = get_days_remaining_in_400yr_cycle( $date1_month_num_05, $date1_day_of_month_05, $offset_year_00 ); |
1596
|
87
|
|
|
|
|
790
|
my $days_used_in_offset_400_year_cycle = get_number_of_day_within_400yr_cycle( $date1_month_num_05, $date1_day_of_month_05, $offset_year_00 ); |
1597
|
87
|
|
|
|
|
166
|
my $day_num_in_400_year_cycle_01; |
1598
|
87
|
100
|
|
|
|
278
|
if ( $date_delta_00 >= 0 ) |
1599
|
|
|
|
|
|
|
{ |
1600
|
44
|
|
|
|
|
209
|
$days_left_00 = int( $date_delta_00 % $NUMBER_OF_DAYS_IN_400_YEAR_CYCLE ); |
1601
|
|
|
|
|
|
|
|
1602
|
|
|
|
|
|
|
|
1603
|
44
|
100
|
|
|
|
290
|
if ( $days_left_in_offset_400_year_cycle >= $days_left_00 ) |
1604
|
|
|
|
|
|
|
{ |
1605
|
39
|
|
|
|
|
111
|
$day_num_in_400_year_cycle_01 = $days_used_in_offset_400_year_cycle + $days_left_00; |
1606
|
|
|
|
|
|
|
} |
1607
|
|
|
|
|
|
|
else |
1608
|
|
|
|
|
|
|
{ |
1609
|
5
|
|
|
|
|
13
|
$day_num_in_400_year_cycle_01 = $days_left_00 - $days_left_in_offset_400_year_cycle; |
1610
|
5
|
|
|
|
|
15
|
$offset_year_00 += $NUMBER_OF_YEAR_PHASES; |
1611
|
|
|
|
|
|
|
} |
1612
|
|
|
|
|
|
|
} |
1613
|
|
|
|
|
|
|
else |
1614
|
|
|
|
|
|
|
{ |
1615
|
43
|
|
|
|
|
457
|
$days_left_00 = int( abs($date_delta_00) % $NUMBER_OF_DAYS_IN_400_YEAR_CYCLE ); |
1616
|
|
|
|
|
|
|
|
1617
|
|
|
|
|
|
|
|
1618
|
43
|
100
|
|
|
|
290
|
if ( $days_used_in_offset_400_year_cycle > $days_left_00 ) |
1619
|
|
|
|
|
|
|
{ |
1620
|
38
|
|
|
|
|
78
|
$day_num_in_400_year_cycle_01 = $days_used_in_offset_400_year_cycle - $days_left_00; |
1621
|
|
|
|
|
|
|
} |
1622
|
|
|
|
|
|
|
else |
1623
|
|
|
|
|
|
|
{ |
1624
|
5
|
|
|
|
|
18
|
$day_num_in_400_year_cycle_01 = $NUMBER_OF_DAYS_IN_400_YEAR_CYCLE - ($days_left_00 - $days_used_in_offset_400_year_cycle); |
1625
|
5
|
|
|
|
|
24
|
$offset_year_00 -= $NUMBER_OF_YEAR_PHASES; |
1626
|
|
|
|
|
|
|
} |
1627
|
|
|
|
|
|
|
} |
1628
|
|
|
|
|
|
|
|
1629
|
87
|
|
|
|
|
317
|
my $which_400_year_cycle_00 = get_global_year_cycle($offset_year_00); |
1630
|
|
|
|
|
|
|
|
1631
|
87
|
|
|
|
|
328
|
$day_num_in_400_year_cycle_01 = day_number_within_400_year_cycle_to_date( $which_400_year_cycle_00, $day_num_in_400_year_cycle_01 ); |
1632
|
|
|
|
|
|
|
|
1633
|
87
|
|
|
|
|
265
|
return ( format_date( $day_num_in_400_year_cycle_01 ) ); |
1634
|
|
|
|
|
|
|
} |
1635
|
|
|
|
|
|
|
|
1636
|
|
|
|
|
|
|
|
1637
|
|
|
|
|
|
|
|
1638
|
|
|
|
|
|
|
|
1639
|
|
|
|
|
|
|
############################################################################### |
1640
|
|
|
|
|
|
|
# Usage : get_global_year_cycle( SCALAR ) |
1641
|
|
|
|
|
|
|
# Purpose : get the phase zero year for the given year |
1642
|
|
|
|
|
|
|
# Returns : - the phase zero year containing the given year if input is valid |
1643
|
|
|
|
|
|
|
# Parameters : ( |
1644
|
|
|
|
|
|
|
# : year in integer format |
1645
|
|
|
|
|
|
|
# : ) |
1646
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
1647
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
1648
|
|
|
|
|
|
|
# : - years repeat in a standard 400 year cycle where year 2000 is defined by this program to be phase '0' and year 2399 is then phase '399' |
1649
|
|
|
|
|
|
|
# : - Examples |
1650
|
|
|
|
|
|
|
# : years 1600 through 1999 return the phase zero year 1600 |
1651
|
|
|
|
|
|
|
# : year 2007 returns the phase zero year 2000 |
1652
|
|
|
|
|
|
|
# See Also : N/A |
1653
|
|
|
|
|
|
|
############################################################################### |
1654
|
|
|
|
|
|
|
sub get_global_year_cycle |
1655
|
|
|
|
|
|
|
{ |
1656
|
|
|
|
|
|
|
my ( |
1657
|
111
|
|
|
111
|
1
|
7294
|
$year_input_08 |
1658
|
|
|
|
|
|
|
) |
1659
|
|
|
|
|
|
|
= @_; |
1660
|
|
|
|
|
|
|
|
1661
|
|
|
|
|
|
|
|
1662
|
|
|
|
|
|
|
# Incoming Inspection |
1663
|
111
|
|
|
|
|
374
|
my $num_input_params_20 = 1; |
1664
|
111
|
100
|
|
|
|
337
|
( @_ == $num_input_params_20) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_20 parameter(s), a date string followed by the number of offset days. '@_'.\n\n\n"; |
|
1
|
|
|
|
|
148
|
|
1665
|
|
|
|
|
|
|
|
1666
|
110
|
100
|
|
|
|
419
|
( ref(\$year_input_08) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year number '$year_input_08'.\n\n\n"; |
|
2
|
|
|
|
|
327
|
|
1667
|
108
|
100
|
|
|
|
343
|
( $year_input_08 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the year number '$year_input_08'.\n\n\n"; |
|
1
|
|
|
|
|
148
|
|
1668
|
107
|
100
|
|
|
|
209
|
( is_valid_year($year_input_08) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the year number '$year_input_08'.\n\n\n"; |
|
3
|
|
|
|
|
793
|
|
1669
|
|
|
|
|
|
|
|
1670
|
|
|
|
|
|
|
|
1671
|
104
|
|
|
|
|
139
|
my $which_400_year_cycle_01; |
1672
|
104
|
100
|
|
|
|
282
|
if ( $year_input_08 >= 0 ) |
1673
|
|
|
|
|
|
|
{ |
1674
|
95
|
|
|
|
|
311
|
$which_400_year_cycle_01 = int( $year_input_08 / $NUMBER_OF_YEAR_PHASES ) * $NUMBER_OF_YEAR_PHASES; |
1675
|
|
|
|
|
|
|
} |
1676
|
|
|
|
|
|
|
else |
1677
|
|
|
|
|
|
|
{ |
1678
|
9
|
100
|
|
|
|
42
|
if ( ( abs($year_input_08) % $NUMBER_OF_YEAR_PHASES ) == 0 ) |
1679
|
|
|
|
|
|
|
{ |
1680
|
4
|
|
|
|
|
30
|
$which_400_year_cycle_01 = int( $year_input_08 / $NUMBER_OF_YEAR_PHASES ) * $NUMBER_OF_YEAR_PHASES; |
1681
|
|
|
|
|
|
|
} |
1682
|
|
|
|
|
|
|
else |
1683
|
|
|
|
|
|
|
{ |
1684
|
5
|
|
|
|
|
50
|
$which_400_year_cycle_01 = int( $year_input_08 / $NUMBER_OF_YEAR_PHASES ) * $NUMBER_OF_YEAR_PHASES - $NUMBER_OF_YEAR_PHASES; |
1685
|
|
|
|
|
|
|
} |
1686
|
|
|
|
|
|
|
} |
1687
|
|
|
|
|
|
|
|
1688
|
104
|
|
|
|
|
1050
|
return ( $which_400_year_cycle_01 ); |
1689
|
|
|
|
|
|
|
} |
1690
|
|
|
|
|
|
|
|
1691
|
|
|
|
|
|
|
|
1692
|
|
|
|
|
|
|
|
1693
|
|
|
|
|
|
|
|
1694
|
|
|
|
|
|
|
############################################################################### |
1695
|
|
|
|
|
|
|
# Usage : get_number_of_days_in_month( SCALAR, SCALAR ) |
1696
|
|
|
|
|
|
|
# Purpose : get the number of days in a specific month |
1697
|
|
|
|
|
|
|
# Returns : - number of days in the month if successful |
1698
|
|
|
|
|
|
|
# Parameters : ( |
1699
|
|
|
|
|
|
|
# : alpha or month integer<1-12>, |
1700
|
|
|
|
|
|
|
# : year integer, |
1701
|
|
|
|
|
|
|
# : ) |
1702
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
1703
|
|
|
|
|
|
|
# Comments : Handles all years, even negative years (aka BC) |
1704
|
|
|
|
|
|
|
# See Also : N/A |
1705
|
|
|
|
|
|
|
############################################################################### |
1706
|
|
|
|
|
|
|
sub get_number_of_days_in_month |
1707
|
|
|
|
|
|
|
{ |
1708
|
|
|
|
|
|
|
my ( |
1709
|
13209
|
|
|
13209
|
1
|
37129
|
$month_input_04, |
1710
|
|
|
|
|
|
|
$year_input_02, |
1711
|
|
|
|
|
|
|
) |
1712
|
|
|
|
|
|
|
= @_; |
1713
|
|
|
|
|
|
|
|
1714
|
|
|
|
|
|
|
|
1715
|
|
|
|
|
|
|
# Incoming Inspection |
1716
|
13209
|
|
|
|
|
15640
|
my $num_input_params_21 = 2; |
1717
|
13209
|
100
|
|
|
|
27652
|
( @_ == $num_input_params_21) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_21 parameter(s), (month, year). '@_'.\n\n\n"; |
|
7
|
|
|
|
|
1051
|
|
1718
|
|
|
|
|
|
|
|
1719
|
13202
|
100
|
|
|
|
31338
|
( ref(\$month_input_04) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month '$month_input_04'.\n\n\n"; |
|
1
|
|
|
|
|
128
|
|
1720
|
13201
|
100
|
|
|
|
28261
|
( $month_input_04 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the month '$month_input_04'.\n\n\n"; |
|
1
|
|
|
|
|
135
|
|
1721
|
13200
|
100
|
|
|
|
36299
|
( is_valid_month($month_input_04) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a valid month '$month_input_04'.\n\n\n"; |
|
10
|
|
|
|
|
1505
|
|
1722
|
|
|
|
|
|
|
|
1723
|
13190
|
100
|
|
|
|
31473
|
( ref(\$year_input_02) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year number '$year_input_02'.\n\n\n"; |
|
2
|
|
|
|
|
438
|
|
1724
|
13188
|
100
|
|
|
|
26759
|
( $year_input_02 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the year number '$year_input_02'.\n\n\n"; |
|
1
|
|
|
|
|
136
|
|
1725
|
13187
|
100
|
|
|
|
25807
|
( is_valid_year($year_input_02) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the year number '$year_input_02'.\n\n\n"; |
|
1
|
|
|
|
|
129
|
|
1726
|
|
|
|
|
|
|
|
1727
|
|
|
|
|
|
|
|
1728
|
13186
|
|
|
|
|
26251
|
my $month_num_06 = set_month_to_month_number($month_input_04); |
1729
|
|
|
|
|
|
|
|
1730
|
|
|
|
|
|
|
# Months with 30 days ( April June September November ) |
1731
|
13186
|
100
|
100
|
|
|
114048
|
if ( ( $month_num_06 == 4 ) || ( $month_num_06 == 6 ) || ( $month_num_06 == 9 ) || ( $month_num_06 == 11 ) ) |
|
|
100
|
100
|
|
|
|
|
|
|
100
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
1732
|
|
|
|
|
|
|
{ |
1733
|
3813
|
|
|
|
|
13997
|
return ( 30 ); |
1734
|
|
|
|
|
|
|
} |
1735
|
|
|
|
|
|
|
# February (NON leap year) |
1736
|
|
|
|
|
|
|
elsif ( ( $month_num_06 == 2 ) && (!( is_leap_year($year_input_02) ) ) ) |
1737
|
|
|
|
|
|
|
{ |
1738
|
1230
|
|
|
|
|
4900
|
return ( 28 ); |
1739
|
|
|
|
|
|
|
} |
1740
|
|
|
|
|
|
|
# February (leap year) |
1741
|
|
|
|
|
|
|
# elsif ( ( $month_num_06 == 2 ) && ( is_leap_year($year_input_02) ) ) |
1742
|
|
|
|
|
|
|
elsif ( $month_num_06 == 2 ) |
1743
|
|
|
|
|
|
|
{ |
1744
|
690
|
|
|
|
|
2906
|
return ( 29 ); |
1745
|
|
|
|
|
|
|
} |
1746
|
|
|
|
|
|
|
# Months with 31 days |
1747
|
|
|
|
|
|
|
else |
1748
|
|
|
|
|
|
|
{ |
1749
|
7453
|
|
|
|
|
27077
|
return ( 31 ); |
1750
|
|
|
|
|
|
|
} |
1751
|
|
|
|
|
|
|
|
1752
|
|
|
|
|
|
|
} |
1753
|
|
|
|
|
|
|
|
1754
|
|
|
|
|
|
|
|
1755
|
|
|
|
|
|
|
|
1756
|
|
|
|
|
|
|
|
1757
|
|
|
|
|
|
|
############################################################################### |
1758
|
|
|
|
|
|
|
# Usage : get_days_remaining_in_month( SCALAR, SCALAR, SCALAR ) |
1759
|
|
|
|
|
|
|
# Purpose : find out how many days are remaining in the month from the given date |
1760
|
|
|
|
|
|
|
# Returns : number of days left if successful |
1761
|
|
|
|
|
|
|
# Parameters : ( |
1762
|
|
|
|
|
|
|
# : alpha or month integer<1-12>, |
1763
|
|
|
|
|
|
|
# : day of month integer<1-N>, |
1764
|
|
|
|
|
|
|
# : year integer, |
1765
|
|
|
|
|
|
|
# : ) |
1766
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
1767
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
1768
|
|
|
|
|
|
|
# : - if the last day of the month is given, 0 is returned |
1769
|
|
|
|
|
|
|
# See Also : N/A |
1770
|
|
|
|
|
|
|
############################################################################### |
1771
|
|
|
|
|
|
|
sub get_days_remaining_in_month |
1772
|
|
|
|
|
|
|
{ |
1773
|
|
|
|
|
|
|
my ( |
1774
|
50
|
|
|
50
|
1
|
14552
|
$month_input_05, |
1775
|
|
|
|
|
|
|
$day_of_month_input_01, |
1776
|
|
|
|
|
|
|
$year_input_03, |
1777
|
|
|
|
|
|
|
) |
1778
|
|
|
|
|
|
|
= @_; |
1779
|
|
|
|
|
|
|
|
1780
|
|
|
|
|
|
|
|
1781
|
|
|
|
|
|
|
# Incoming Inspection |
1782
|
50
|
|
|
|
|
83
|
my $num_input_params_22 = 3; |
1783
|
50
|
100
|
|
|
|
141
|
( @_ == $num_input_params_22) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_22 parameter(s), (month, day_of_month, year). '@_'.\n\n\n"; |
|
1
|
|
|
|
|
276
|
|
1784
|
|
|
|
|
|
|
|
1785
|
|
|
|
|
|
|
|
1786
|
49
|
100
|
|
|
|
141
|
( ref(\$month_input_05) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month '$month_input_05'.\n\n\n"; |
|
1
|
|
|
|
|
132
|
|
1787
|
48
|
100
|
|
|
|
110
|
( $month_input_05 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the month '$month_input_05'.\n\n\n"; |
|
1
|
|
|
|
|
158
|
|
1788
|
47
|
100
|
|
|
|
95
|
( is_valid_month($month_input_05) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a valid month '$month_input_05'.\n\n\n"; |
|
1
|
|
|
|
|
162
|
|
1789
|
|
|
|
|
|
|
|
1790
|
46
|
100
|
|
|
|
143
|
( ref(\$year_input_03) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year number '$year_input_03'.\n\n\n"; |
|
1
|
|
|
|
|
157
|
|
1791
|
45
|
100
|
|
|
|
114
|
( $year_input_03 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the year number '$year_input_03'.\n\n\n"; |
|
1
|
|
|
|
|
156
|
|
1792
|
44
|
100
|
|
|
|
87
|
( is_valid_year($year_input_03) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the year number '$year_input_03'.\n\n\n"; |
|
1
|
|
|
|
|
169
|
|
1793
|
|
|
|
|
|
|
|
1794
|
43
|
100
|
|
|
|
105
|
( ref(\$day_of_month_input_01) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day of month '$day_of_month_input_01'.\n\n\n"; |
|
1
|
|
|
|
|
176
|
|
1795
|
42
|
100
|
|
|
|
99
|
( $day_of_month_input_01 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the day of month '$day_of_month_input_01'.\n\n\n"; |
|
1
|
|
|
|
|
147
|
|
1796
|
41
|
100
|
|
|
|
83
|
( is_valid_day_of_month($month_input_05, $day_of_month_input_01, $year_input_03) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value for the day of month (1-31) '$day_of_month_input_01'.\n\n\n"; |
|
16
|
|
|
|
|
2493
|
|
1797
|
|
|
|
|
|
|
|
1798
|
|
|
|
|
|
|
|
1799
|
25
|
|
|
|
|
55
|
my $month_num_07 = set_month_to_month_number($month_input_05); |
1800
|
|
|
|
|
|
|
|
1801
|
|
|
|
|
|
|
# Months with 30 days ( April June September November ) |
1802
|
25
|
100
|
100
|
|
|
256
|
if ( ( $month_num_07 == 4 ) || ( $month_num_07 == 6 ) || ( $month_num_07 == 9 ) || ( $month_num_07 == 11 ) ) |
|
|
100
|
100
|
|
|
|
|
|
|
100
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
1803
|
|
|
|
|
|
|
{ |
1804
|
6
|
|
|
|
|
31
|
return ( 30 - $day_of_month_input_01 ); |
1805
|
|
|
|
|
|
|
} |
1806
|
|
|
|
|
|
|
# February (NON leap year) |
1807
|
|
|
|
|
|
|
elsif ( ( $month_num_07 == 2 ) && (!( is_leap_year($year_input_03) ) ) ) |
1808
|
|
|
|
|
|
|
{ |
1809
|
5
|
|
|
|
|
29
|
return ( 28 - $day_of_month_input_01 ); |
1810
|
|
|
|
|
|
|
} |
1811
|
|
|
|
|
|
|
# February (leap year) |
1812
|
|
|
|
|
|
|
# elsif ( ( $month_num_07 == 2 ) && ( is_leap_year($year_input_03) ) ) |
1813
|
|
|
|
|
|
|
elsif ( $month_num_07 == 2 ) |
1814
|
|
|
|
|
|
|
{ |
1815
|
3
|
|
|
|
|
19
|
return ( 29 - $day_of_month_input_01 ); |
1816
|
|
|
|
|
|
|
} |
1817
|
|
|
|
|
|
|
# Months with 31 days |
1818
|
|
|
|
|
|
|
else |
1819
|
|
|
|
|
|
|
{ |
1820
|
11
|
|
|
|
|
65
|
return ( 31 - $day_of_month_input_01 ); |
1821
|
|
|
|
|
|
|
} |
1822
|
|
|
|
|
|
|
|
1823
|
|
|
|
|
|
|
} |
1824
|
|
|
|
|
|
|
|
1825
|
|
|
|
|
|
|
|
1826
|
|
|
|
|
|
|
|
1827
|
|
|
|
|
|
|
|
1828
|
|
|
|
|
|
|
############################################################################### |
1829
|
|
|
|
|
|
|
# Usage : get_days_remaining_in_year( SCALAR, SCALAR, SCALAR ) |
1830
|
|
|
|
|
|
|
# Purpose : find out how many days are remaining in the year from the given date |
1831
|
|
|
|
|
|
|
# Returns : number of days left if successful |
1832
|
|
|
|
|
|
|
# Parameters : ( |
1833
|
|
|
|
|
|
|
# : alpha or month integer<1-12>, |
1834
|
|
|
|
|
|
|
# : day of month integer<1-N>, |
1835
|
|
|
|
|
|
|
# : year integer, |
1836
|
|
|
|
|
|
|
# : ) |
1837
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
1838
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
1839
|
|
|
|
|
|
|
# : - if the last day of the year is given, 0 is returned |
1840
|
|
|
|
|
|
|
# See Also : N/A |
1841
|
|
|
|
|
|
|
############################################################################### |
1842
|
|
|
|
|
|
|
sub get_days_remaining_in_year |
1843
|
|
|
|
|
|
|
{ |
1844
|
|
|
|
|
|
|
my ( |
1845
|
26
|
|
|
26
|
1
|
11464
|
$month_input_06, |
1846
|
|
|
|
|
|
|
$day_of_month_input_02, |
1847
|
|
|
|
|
|
|
$year_input_04, |
1848
|
|
|
|
|
|
|
) |
1849
|
|
|
|
|
|
|
= @_; |
1850
|
|
|
|
|
|
|
|
1851
|
|
|
|
|
|
|
|
1852
|
|
|
|
|
|
|
# Incoming Inspection |
1853
|
26
|
|
|
|
|
46
|
my $num_input_params_23 = 3; |
1854
|
26
|
100
|
|
|
|
82
|
( @_ == $num_input_params_23) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_23 parameter(s), (month, day_of_month, year). '@_'.\n\n\n"; |
|
2
|
|
|
|
|
299
|
|
1855
|
|
|
|
|
|
|
|
1856
|
|
|
|
|
|
|
|
1857
|
24
|
100
|
|
|
|
87
|
( ref(\$month_input_06) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month '$month_input_06'.\n\n\n"; |
|
1
|
|
|
|
|
423
|
|
1858
|
23
|
100
|
|
|
|
70
|
( $month_input_06 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the month '$month_input_06'.\n\n\n"; |
|
1
|
|
|
|
|
141
|
|
1859
|
22
|
100
|
|
|
|
52
|
( is_valid_month($month_input_06) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a valid month '$month_input_06'.\n\n\n"; |
|
4
|
|
|
|
|
554
|
|
1860
|
|
|
|
|
|
|
|
1861
|
18
|
100
|
|
|
|
60
|
( ref(\$year_input_04) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year number '$year_input_04'.\n\n\n"; |
|
1
|
|
|
|
|
155
|
|
1862
|
17
|
100
|
|
|
|
57
|
( $year_input_04 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the year number '$year_input_04'.\n\n\n"; |
|
1
|
|
|
|
|
141
|
|
1863
|
16
|
100
|
|
|
|
36
|
( is_valid_year($year_input_04) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the year number '$year_input_04'.\n\n\n"; |
|
1
|
|
|
|
|
168
|
|
1864
|
|
|
|
|
|
|
|
1865
|
15
|
100
|
|
|
|
47
|
( ref(\$day_of_month_input_02) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day of month '$day_of_month_input_02'.\n\n\n"; |
|
1
|
|
|
|
|
162
|
|
1866
|
14
|
100
|
|
|
|
42
|
( $day_of_month_input_02 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the day of month '$day_of_month_input_02'.\n\n\n"; |
|
1
|
|
|
|
|
171
|
|
1867
|
13
|
100
|
|
|
|
31
|
( is_valid_day_of_month($month_input_06, $day_of_month_input_02, $year_input_04) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value for the day of month (1-31) '$day_of_month_input_02'.\n\n\n"; |
|
4
|
|
|
|
|
702
|
|
1868
|
|
|
|
|
|
|
|
1869
|
|
|
|
|
|
|
|
1870
|
9
|
|
|
|
|
21
|
my $month_num_08 = set_month_to_month_number($month_input_06); |
1871
|
|
|
|
|
|
|
|
1872
|
9
|
|
|
|
|
36
|
return ( get_num_days_in_year( $year_input_04 ) - number_of_day_within_year( "${month_num_08}/${day_of_month_input_02}/${year_input_04}" ) ); |
1873
|
|
|
|
|
|
|
} |
1874
|
|
|
|
|
|
|
|
1875
|
|
|
|
|
|
|
|
1876
|
|
|
|
|
|
|
|
1877
|
|
|
|
|
|
|
|
1878
|
|
|
|
|
|
|
############################################################################### |
1879
|
|
|
|
|
|
|
# Usage : get_number_of_day_within_400yr_cycle( SCALAR, SCALAR, SCALAR ) |
1880
|
|
|
|
|
|
|
# Purpose : find the number of the day within the standard 400 year cycle |
1881
|
|
|
|
|
|
|
# Returns : day number if successful |
1882
|
|
|
|
|
|
|
# Parameters : ( |
1883
|
|
|
|
|
|
|
# : alpha or month integer<1-12>, |
1884
|
|
|
|
|
|
|
# : day of month integer<1-N>, |
1885
|
|
|
|
|
|
|
# : year integer, |
1886
|
|
|
|
|
|
|
# : ) |
1887
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
1888
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
1889
|
|
|
|
|
|
|
# : - years repeat in a standard 400 year cycle where year 2000 is defined by this program to be phase '0' and year 2399 is then phase '399' |
1890
|
|
|
|
|
|
|
# : - this would be a very LARGE integer for the 1990's |
1891
|
|
|
|
|
|
|
# : - Jan 1, 2000 would return '1' |
1892
|
|
|
|
|
|
|
# See Also : N/A |
1893
|
|
|
|
|
|
|
############################################################################### |
1894
|
|
|
|
|
|
|
sub get_number_of_day_within_400yr_cycle |
1895
|
|
|
|
|
|
|
{ |
1896
|
|
|
|
|
|
|
my ( |
1897
|
208
|
|
|
208
|
1
|
10606
|
$month_input_07, |
1898
|
|
|
|
|
|
|
$day_of_month_input_03, |
1899
|
|
|
|
|
|
|
$year_input_05, |
1900
|
|
|
|
|
|
|
) |
1901
|
|
|
|
|
|
|
= @_; |
1902
|
|
|
|
|
|
|
|
1903
|
|
|
|
|
|
|
|
1904
|
|
|
|
|
|
|
# Incoming Inspection |
1905
|
208
|
|
|
|
|
399
|
my $num_input_params_24 = 3; |
1906
|
208
|
100
|
|
|
|
577
|
( @_ == $num_input_params_24) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_24 parameter(s), (month, day_of_month, year). '@_'.\n\n\n"; |
|
1
|
|
|
|
|
147
|
|
1907
|
|
|
|
|
|
|
|
1908
|
|
|
|
|
|
|
|
1909
|
207
|
100
|
|
|
|
726
|
( ref(\$month_input_07) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month '$month_input_07'.\n\n\n"; |
|
1
|
|
|
|
|
171
|
|
1910
|
206
|
100
|
|
|
|
2503
|
( $month_input_07 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the month '$month_input_07'.\n\n\n"; |
|
1
|
|
|
|
|
159
|
|
1911
|
205
|
100
|
|
|
|
447
|
( is_valid_month($month_input_07) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a valid month '$month_input_07'.\n\n\n"; |
|
5
|
|
|
|
|
794
|
|
1912
|
|
|
|
|
|
|
|
1913
|
200
|
100
|
|
|
|
696
|
( ref(\$year_input_05) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year number '$year_input_05'.\n\n\n"; |
|
1
|
|
|
|
|
140
|
|
1914
|
199
|
100
|
|
|
|
547
|
( $year_input_05 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the year number '$year_input_05'.\n\n\n"; |
|
1
|
|
|
|
|
140
|
|
1915
|
198
|
100
|
|
|
|
453
|
( is_valid_year($year_input_05) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the year number '$year_input_05'.\n\n\n"; |
|
1
|
|
|
|
|
164
|
|
1916
|
|
|
|
|
|
|
|
1917
|
197
|
100
|
|
|
|
822
|
( ref(\$day_of_month_input_03) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day of month '$day_of_month_input_03'.\n\n\n"; |
|
1
|
|
|
|
|
133
|
|
1918
|
196
|
100
|
|
|
|
493
|
( $day_of_month_input_03 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the day of month '$day_of_month_input_03'.\n\n\n"; |
|
1
|
|
|
|
|
134
|
|
1919
|
195
|
100
|
|
|
|
402
|
( is_valid_day_of_month($month_input_07, $day_of_month_input_03, $year_input_05) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value for the day of month (1-31) '$day_of_month_input_03'.\n\n\n"; |
|
3
|
|
|
|
|
440
|
|
1920
|
|
|
|
|
|
|
|
1921
|
|
|
|
|
|
|
|
1922
|
192
|
|
|
|
|
404
|
my $month_num_09 = set_month_to_month_number($month_input_07); |
1923
|
|
|
|
|
|
|
|
1924
|
192
|
|
|
|
|
624
|
my $year_phase_01 = get_year_phase($year_input_05); |
1925
|
192
|
|
|
|
|
410
|
my $day_num_in_400_year_cycle_00 = 0; |
1926
|
192
|
|
|
|
|
260
|
my $iii_000 = 0; |
1927
|
192
|
|
|
|
|
588
|
for ( $iii_000=0; $iii_000<$year_phase_01; $iii_000++ ) |
1928
|
|
|
|
|
|
|
{ |
1929
|
62063
|
|
|
|
|
105563
|
$day_num_in_400_year_cycle_00 += get_num_days_in_year($iii_000); |
1930
|
|
|
|
|
|
|
} |
1931
|
192
|
|
|
|
|
1319
|
$day_num_in_400_year_cycle_00 += number_of_day_within_year( "${month_num_09}/${day_of_month_input_03}/${iii_000}" ); |
1932
|
|
|
|
|
|
|
|
1933
|
192
|
|
|
|
|
814
|
return ( $day_num_in_400_year_cycle_00 ); |
1934
|
|
|
|
|
|
|
|
1935
|
|
|
|
|
|
|
} |
1936
|
|
|
|
|
|
|
|
1937
|
|
|
|
|
|
|
|
1938
|
|
|
|
|
|
|
|
1939
|
|
|
|
|
|
|
|
1940
|
|
|
|
|
|
|
############################################################################### |
1941
|
|
|
|
|
|
|
# Usage : get_days_remaining_in_400yr_cycle( SCALAR, SCALAR, SCALAR ) |
1942
|
|
|
|
|
|
|
# Purpose : find the number of days remaining from the given date to the end of the current standard 400 year cycle |
1943
|
|
|
|
|
|
|
# Returns : number of days left if successful |
1944
|
|
|
|
|
|
|
# Parameters : ( |
1945
|
|
|
|
|
|
|
# : alpha or month integer<1-12>, |
1946
|
|
|
|
|
|
|
# : day of month integer<1-N>, |
1947
|
|
|
|
|
|
|
# : year integer, |
1948
|
|
|
|
|
|
|
# : ) |
1949
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
1950
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
1951
|
|
|
|
|
|
|
# : - years repeat in a standard 400 year cycle where year 2000 is defined by this program to be phase '0' and year 2399 is then phase '399' |
1952
|
|
|
|
|
|
|
# : - this would be a very SMALL integer for the 1990's |
1953
|
|
|
|
|
|
|
# : - Jan 1, 2000 would return '146096'. There are a total of 146,097 days in the standard 400 year cycle. |
1954
|
|
|
|
|
|
|
# See Also : N/A |
1955
|
|
|
|
|
|
|
############################################################################### |
1956
|
|
|
|
|
|
|
sub get_days_remaining_in_400yr_cycle |
1957
|
|
|
|
|
|
|
{ |
1958
|
|
|
|
|
|
|
my ( |
1959
|
109
|
|
|
109
|
1
|
17570
|
$month_input_08, |
1960
|
|
|
|
|
|
|
$day_of_month_input_04, |
1961
|
|
|
|
|
|
|
$year_input_06, |
1962
|
|
|
|
|
|
|
) |
1963
|
|
|
|
|
|
|
= @_; |
1964
|
|
|
|
|
|
|
|
1965
|
|
|
|
|
|
|
|
1966
|
|
|
|
|
|
|
# Incoming Inspection |
1967
|
109
|
|
|
|
|
233
|
my $num_input_params_25 = 3; |
1968
|
109
|
100
|
|
|
|
319
|
( @_ == $num_input_params_25) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_25 parameter(s), (month, day_of_month, year). '@_'.\n\n\n"; |
|
1
|
|
|
|
|
8616
|
|
1969
|
|
|
|
|
|
|
|
1970
|
|
|
|
|
|
|
|
1971
|
108
|
100
|
|
|
|
379
|
( ref(\$month_input_08) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month '$month_input_08'.\n\n\n"; |
|
1
|
|
|
|
|
154
|
|
1972
|
107
|
100
|
|
|
|
518
|
( $month_input_08 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the month '$month_input_08'.\n\n\n"; |
|
1
|
|
|
|
|
153
|
|
1973
|
106
|
100
|
|
|
|
234
|
( is_valid_month($month_input_08) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a valid month '$month_input_08'.\n\n\n"; |
|
4
|
|
|
|
|
825
|
|
1974
|
|
|
|
|
|
|
|
1975
|
102
|
100
|
|
|
|
330
|
( ref(\$year_input_06) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year number '$year_input_06'.\n\n\n"; |
|
1
|
|
|
|
|
161
|
|
1976
|
101
|
100
|
|
|
|
304
|
( $year_input_06 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the year number '$year_input_06'.\n\n\n"; |
|
1
|
|
|
|
|
140
|
|
1977
|
100
|
100
|
|
|
|
180
|
( is_valid_year($year_input_06) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the year number '$year_input_06'.\n\n\n"; |
|
1
|
|
|
|
|
3808
|
|
1978
|
|
|
|
|
|
|
|
1979
|
99
|
100
|
|
|
|
316
|
( ref(\$day_of_month_input_04) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day of month '$day_of_month_input_04'.\n\n\n"; |
|
1
|
|
|
|
|
152
|
|
1980
|
98
|
100
|
|
|
|
293
|
( $day_of_month_input_04 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the day of month '$day_of_month_input_04'.\n\n\n"; |
|
1
|
|
|
|
|
167
|
|
1981
|
97
|
100
|
|
|
|
276
|
( is_valid_day_of_month($month_input_08, $day_of_month_input_04, $year_input_06) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value for the day of month (1-31) '$day_of_month_input_04'.\n\n\n"; |
|
2
|
|
|
|
|
287
|
|
1982
|
|
|
|
|
|
|
|
1983
|
|
|
|
|
|
|
|
1984
|
95
|
|
|
|
|
200
|
my $month_num_10 = set_month_to_month_number($month_input_08); |
1985
|
|
|
|
|
|
|
|
1986
|
95
|
|
|
|
|
425
|
return ( $NUMBER_OF_DAYS_IN_400_YEAR_CYCLE - get_number_of_day_within_400yr_cycle( $month_num_10, $day_of_month_input_04, $year_input_06 ) ); |
1987
|
|
|
|
|
|
|
} |
1988
|
|
|
|
|
|
|
|
1989
|
|
|
|
|
|
|
|
1990
|
|
|
|
|
|
|
|
1991
|
|
|
|
|
|
|
|
1992
|
|
|
|
|
|
|
############################################################################### |
1993
|
|
|
|
|
|
|
# Usage : day_number_within_year_to_date( SCALAR, SCALAR ) |
1994
|
|
|
|
|
|
|
# Purpose : converts the number of the day within the year to a date |
1995
|
|
|
|
|
|
|
# Returns : date if successful |
1996
|
|
|
|
|
|
|
# Parameters : ( |
1997
|
|
|
|
|
|
|
# : year integer, |
1998
|
|
|
|
|
|
|
# : number of day in year <1-365/6>, |
1999
|
|
|
|
|
|
|
# : ) |
2000
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
2001
|
|
|
|
|
|
|
# Comments : Handles all years, even negative years (aka BC) |
2002
|
|
|
|
|
|
|
# See Also : N/A |
2003
|
|
|
|
|
|
|
############################################################################### |
2004
|
|
|
|
|
|
|
sub day_number_within_year_to_date |
2005
|
|
|
|
|
|
|
{ |
2006
|
|
|
|
|
|
|
my ( |
2007
|
170
|
|
|
170
|
1
|
11530
|
$year_input_07, |
2008
|
|
|
|
|
|
|
$day_number_in_year_00, |
2009
|
|
|
|
|
|
|
) |
2010
|
|
|
|
|
|
|
= @_; |
2011
|
|
|
|
|
|
|
|
2012
|
|
|
|
|
|
|
|
2013
|
|
|
|
|
|
|
# Incoming Inspection |
2014
|
170
|
|
|
|
|
272
|
my $num_input_params_26 = 2; |
2015
|
170
|
100
|
|
|
|
491
|
( @_ == $num_input_params_26) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_26 parameter(s), (month, day_of_month, year). '@_'.\n\n\n"; |
|
4
|
|
|
|
|
523
|
|
2016
|
|
|
|
|
|
|
|
2017
|
166
|
100
|
|
|
|
700
|
( ref(\$year_input_07) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year number '$year_input_07'.\n\n\n"; |
|
1
|
|
|
|
|
120
|
|
2018
|
165
|
100
|
|
|
|
488
|
( $year_input_07 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the year number '$year_input_07'.\n\n\n"; |
|
1
|
|
|
|
|
123
|
|
2019
|
164
|
100
|
|
|
|
588
|
( is_valid_year($year_input_07) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the year number '$year_input_07'.\n\n\n"; |
|
1
|
|
|
|
|
129
|
|
2020
|
|
|
|
|
|
|
|
2021
|
163
|
100
|
|
|
|
555
|
( ref(\$day_number_in_year_00) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day number within the year '$day_number_in_year_00'.\n\n\n"; |
|
1
|
|
|
|
|
123
|
|
2022
|
162
|
100
|
|
|
|
508
|
( $day_number_in_year_00 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the day number within the year '$day_number_in_year_00'.\n\n\n"; |
|
1
|
|
|
|
|
127
|
|
2023
|
|
|
|
|
|
|
|
2024
|
|
|
|
|
|
|
|
2025
|
161
|
100
|
|
|
|
373
|
if ( !(is_leap_year($year_input_07)) ) |
2026
|
|
|
|
|
|
|
{ |
2027
|
113
|
100
|
100
|
|
|
1886
|
( ( $day_number_in_year_00 =~ m/^(\d{1,3})$/ ) && ( $1 > 0 ) && ( $1 < 366 ) ) or croak "\n\n ($0) '${\(caller(0))[3]}' The number of the day within a NON leap must be in the range of 1-365 '$day_number_in_year_00'.\n\n\n"; |
|
5
|
|
100
|
|
|
671
|
|
2028
|
|
|
|
|
|
|
} |
2029
|
|
|
|
|
|
|
else |
2030
|
|
|
|
|
|
|
{ |
2031
|
48
|
100
|
100
|
|
|
596
|
( ( $day_number_in_year_00 =~ m/^(\d{1,3})$/ ) && ( $1 > 0 ) && ( $1 < 367 ) ) or croak "\n\n ($0) '${\(caller(0))[3]}' The number of the day within a LEAP must be in the range of 1-366 '$day_number_in_year_00'.\n\n\n"; |
|
3
|
|
100
|
|
|
513
|
|
2032
|
|
|
|
|
|
|
} |
2033
|
|
|
|
|
|
|
|
2034
|
|
|
|
|
|
|
|
2035
|
153
|
|
|
|
|
244
|
my $date_from_num_00; |
2036
|
|
|
|
|
|
|
|
2037
|
153
|
100
|
|
|
|
532
|
if ( $day_number_in_year_00 < 32 ) |
|
|
100
|
|
|
|
|
|
2038
|
|
|
|
|
|
|
{ |
2039
|
17
|
|
|
|
|
53
|
$date_from_num_00 = "1/" . $day_number_in_year_00 . "/$year_input_07"; |
2040
|
|
|
|
|
|
|
} |
2041
|
|
|
|
|
|
|
elsif ( !( is_leap_year($year_input_07) ) ) |
2042
|
|
|
|
|
|
|
{ |
2043
|
102
|
|
|
|
|
284
|
foreach ($day_number_in_year_00) |
2044
|
|
|
|
|
|
|
{ |
2045
|
|
|
|
|
|
|
SWITCH: |
2046
|
|
|
|
|
|
|
{ |
2047
|
102
|
100
|
|
|
|
174
|
if ( $_ < 60 ) { $date_from_num_00 = "2/" . ($_ - 31) . "/$year_input_07"; last SWITCH; } # if ( $_ < (31 + 29) ) |
|
102
|
|
|
|
|
334
|
|
|
2
|
|
|
|
|
7
|
|
|
2
|
|
|
|
|
6
|
|
2048
|
100
|
100
|
|
|
|
360
|
if ( $_ < 91 ) { $date_from_num_00 = "3/" . ($_ - 59) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 28 + 32) ) $date_from_num_00 = "3/" . ($_ - (31 + 28)) . "/$year_input_07"; |
|
2
|
|
|
|
|
7
|
|
|
2
|
|
|
|
|
6
|
|
2049
|
98
|
100
|
|
|
|
247
|
if ( $_ < 121 ) { $date_from_num_00 = "4/" . ($_ - 90) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 28 + 31 + 31) ) $date_from_num_00 = "4/" . ($_ - (31 + 28 + 31)) . "/$year_input_07"; |
|
2
|
|
|
|
|
7
|
|
|
2
|
|
|
|
|
6
|
|
2050
|
96
|
100
|
|
|
|
262
|
if ( $_ < 152 ) { $date_from_num_00 = "5/" . ($_ - 120) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 28 + 31 + 30 + 32) ) $date_from_num_00 = "5/" . ($_ - (31 + 28 + 31 + 30)) . "/$year_input_07"; |
|
2
|
|
|
|
|
8
|
|
|
2
|
|
|
|
|
6
|
|
2051
|
94
|
100
|
|
|
|
281
|
if ( $_ < 182 ) { $date_from_num_00 = "6/" . ($_ - 151) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 28 + 31 + 30 + 31 + 31) ) $date_from_num_00 = "6/" . ($_ - (31 + 28 + 31 + 30 + 31)) . "/$year_input_07"; |
|
3
|
|
|
|
|
16
|
|
|
3
|
|
|
|
|
11
|
|
2052
|
91
|
100
|
|
|
|
245
|
if ( $_ < 213 ) { $date_from_num_00 = "7/" . ($_ - 181) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 28 + 31 + 30 + 31 + 30 + 32) ) $date_from_num_00 = "7/" . ($_ - (31 + 28 + 31 + 30 + 31 + 30)) . "/$year_input_07"; |
|
71
|
|
|
|
|
320
|
|
|
71
|
|
|
|
|
303
|
|
2053
|
20
|
100
|
|
|
|
52
|
if ( $_ < 244 ) { $date_from_num_00 = "8/" . ($_ - 212) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 28 + 31 + 30 + 31 + 30 + 31 + 32) ) $date_from_num_00 = "8/" . ($_ - (31 + 28 + 31 + 30 + 31 + 30 + 31)) . "/$year_input_07"; |
|
2
|
|
|
|
|
8
|
|
|
2
|
|
|
|
|
7
|
|
2054
|
18
|
100
|
|
|
|
52
|
if ( $_ < 274 ) { $date_from_num_00 = "9/" . ($_ - 243) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 31) ) $date_from_num_00 = "9/" . ($_ - (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31)) . "/$year_input_07"; |
|
2
|
|
|
|
|
5
|
|
|
2
|
|
|
|
|
7
|
|
2055
|
16
|
100
|
|
|
|
38
|
if ( $_ < 305 ) { $date_from_num_00 = "10/" . ($_ - 273) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 32) ) $date_from_num_00 = "10/" . ($_ - (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30)) . "/$year_input_07"; |
|
3
|
|
|
|
|
16
|
|
|
3
|
|
|
|
|
10
|
|
2056
|
13
|
100
|
|
|
|
63
|
if ( $_ < 335 ) { $date_from_num_00 = "11/" . ($_ - 304) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 31) ) $date_from_num_00 = "11/" . ($_ - (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31)) . "/$year_input_07"; |
|
2
|
|
|
|
|
8
|
|
|
2
|
|
|
|
|
6
|
|
2057
|
11
|
|
|
|
|
96
|
$date_from_num_00 = "12/" . ($_ - 334) . "/$year_input_07"; # $date_from_num_00 = "12/" . ($_ - (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30)) . "/$year_input_07"; |
2058
|
|
|
|
|
|
|
} |
2059
|
|
|
|
|
|
|
} |
2060
|
|
|
|
|
|
|
} |
2061
|
|
|
|
|
|
|
else |
2062
|
|
|
|
|
|
|
{ |
2063
|
34
|
|
|
|
|
65
|
foreach ($day_number_in_year_00) |
2064
|
|
|
|
|
|
|
{ |
2065
|
|
|
|
|
|
|
SWITCH: |
2066
|
|
|
|
|
|
|
{ |
2067
|
34
|
100
|
|
|
|
42
|
if ( $_ < 61 ) { $date_from_num_00 = "2/" . ($_ - 31) . "/$year_input_07"; last SWITCH; } # if ( $_ < (31 + 30) ) |
|
34
|
|
|
|
|
93
|
|
|
3
|
|
|
|
|
14
|
|
|
3
|
|
|
|
|
12
|
|
2068
|
31
|
100
|
|
|
|
72
|
if ( $_ < 92 ) { $date_from_num_00 = "3/" . ($_ - 60) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 29 + 32) ) $date_from_num_00 = "3/" . ($_ - (31 + 29)) . "/$year_input_07"; |
|
3
|
|
|
|
|
11
|
|
|
3
|
|
|
|
|
9
|
|
2069
|
28
|
100
|
|
|
|
63
|
if ( $_ < 122 ) { $date_from_num_00 = "4/" . ($_ - 91) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 29 + 31 + 31) ) $date_from_num_00 = "4/" . ($_ - (31 + 29 + 31)) . "/$year_input_07"; |
|
3
|
|
|
|
|
11
|
|
|
3
|
|
|
|
|
8
|
|
2070
|
25
|
100
|
|
|
|
55
|
if ( $_ < 153 ) { $date_from_num_00 = "5/" . ($_ - 121) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 29 + 31 + 30 + 32) ) $date_from_num_00 = "5/" . ($_ - (31 + 29 + 31 + 30)) . "/$year_input_07"; |
|
3
|
|
|
|
|
10
|
|
|
3
|
|
|
|
|
10
|
|
2071
|
22
|
100
|
|
|
|
50
|
if ( $_ < 183 ) { $date_from_num_00 = "6/" . ($_ - 152) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 29 + 31 + 30 + 31 + 31) ) $date_from_num_00 = "6/" . ($_ - (31 + 29 + 31 + 30 + 31)) . "/$year_input_07"; |
|
3
|
|
|
|
|
10
|
|
|
3
|
|
|
|
|
10
|
|
2072
|
19
|
100
|
|
|
|
44
|
if ( $_ < 214 ) { $date_from_num_00 = "7/" . ($_ - 182) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 29 + 31 + 30 + 31 + 30 + 32) ) $date_from_num_00 = "7/" . ($_ - (31 + 29 + 31 + 30 + 31 + 30)) . "/$year_input_07"; |
|
3
|
|
|
|
|
8
|
|
|
3
|
|
|
|
|
11
|
|
2073
|
16
|
100
|
|
|
|
33
|
if ( $_ < 245 ) { $date_from_num_00 = "8/" . ($_ - 213) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 29 + 31 + 30 + 31 + 30 + 31 + 32) ) $date_from_num_00 = "8/" . ($_ - (31 + 29 + 31 + 30 + 31 + 30 + 31)) . "/$year_input_07"; |
|
3
|
|
|
|
|
11
|
|
|
3
|
|
|
|
|
10
|
|
2074
|
13
|
100
|
|
|
|
43
|
if ( $_ < 275 ) { $date_from_num_00 = "9/" . ($_ - 244) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 31) ) $date_from_num_00 = "9/" . ($_ - (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31)) . "/$year_input_07"; |
|
3
|
|
|
|
|
9
|
|
|
3
|
|
|
|
|
9
|
|
2075
|
10
|
100
|
|
|
|
26
|
if ( $_ < 306 ) { $date_from_num_00 = "10/" . ($_ - 274) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 32) ) $date_from_num_00 = "10/" . ($_ - (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30)) . "/$year_input_07"; |
|
3
|
|
|
|
|
10
|
|
|
3
|
|
|
|
|
10
|
|
2076
|
7
|
100
|
|
|
|
19
|
if ( $_ < 336 ) { $date_from_num_00 = "11/" . ($_ - 305) . "/$year_input_07"; last SWITCH; } # elsif ( $_ < (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 31) ) $date_from_num_00 = "11/" . ($_ - (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31)) . "/$year_input_07"; |
|
3
|
|
|
|
|
10
|
|
|
3
|
|
|
|
|
7
|
|
2077
|
4
|
|
|
|
|
21
|
$date_from_num_00 = "12/" . ($_ - 335) . "/$year_input_07"; # $date_from_num_00 = "12/" . ($_ - (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30)) . "/$year_input_07"; |
2078
|
|
|
|
|
|
|
} |
2079
|
|
|
|
|
|
|
} |
2080
|
|
|
|
|
|
|
} |
2081
|
|
|
|
|
|
|
|
2082
|
153
|
|
|
|
|
612
|
return ( format_date( $date_from_num_00 ) ); |
2083
|
|
|
|
|
|
|
} |
2084
|
|
|
|
|
|
|
|
2085
|
|
|
|
|
|
|
|
2086
|
|
|
|
|
|
|
|
2087
|
|
|
|
|
|
|
|
2088
|
|
|
|
|
|
|
############################################################################### |
2089
|
|
|
|
|
|
|
# Usage : day_number_within_400_year_cycle_to_date( SCALAR, SCALAR ) |
2090
|
|
|
|
|
|
|
# Purpose : converts the number of the day within the standard 400 year cycle to a date |
2091
|
|
|
|
|
|
|
# Returns : date if successful |
2092
|
|
|
|
|
|
|
# Parameters : ( |
2093
|
|
|
|
|
|
|
# : 400 year cycle, (i.e. ... -400, 0, 400, ... 1600, 2000, 2400, ...) |
2094
|
|
|
|
|
|
|
# : number of day in the standard 400 year cycle <1-146097>, |
2095
|
|
|
|
|
|
|
# : ) |
2096
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
2097
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
2098
|
|
|
|
|
|
|
# : - years repeat in a standard 400 year cycle where year 2000 is defined by this program to be phase '0' and year 2399 is then phase '399' |
2099
|
|
|
|
|
|
|
# See Also : N/A |
2100
|
|
|
|
|
|
|
############################################################################### |
2101
|
|
|
|
|
|
|
sub day_number_within_400_year_cycle_to_date |
2102
|
|
|
|
|
|
|
{ |
2103
|
|
|
|
|
|
|
my ( |
2104
|
109
|
|
|
109
|
1
|
8084
|
$four_hundred_year_cycle_00, |
2105
|
|
|
|
|
|
|
$day_number_in_400_year_cycle_00, |
2106
|
|
|
|
|
|
|
) |
2107
|
|
|
|
|
|
|
= @_; |
2108
|
|
|
|
|
|
|
|
2109
|
|
|
|
|
|
|
|
2110
|
|
|
|
|
|
|
# Incoming Inspection |
2111
|
109
|
|
|
|
|
191
|
my $num_input_params_27 = 2; |
2112
|
109
|
100
|
|
|
|
303
|
( @_ == $num_input_params_27) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_27 parameter(s), (400 year cycle<-400,0,400,...,2000>, day number within 400 year cycle<1 - 146097> ). '@_'.\n\n\n"; |
|
5
|
|
|
|
|
527
|
|
2113
|
|
|
|
|
|
|
|
2114
|
104
|
100
|
|
|
|
383
|
( ref(\$four_hundred_year_cycle_00) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the 400 year cycle<-400,0,400,...,2000>, day number within 400 year cycle<1 - 146097> '$four_hundred_year_cycle_00'.\n\n\n"; |
|
1
|
|
|
|
|
92
|
|
2115
|
103
|
100
|
|
|
|
299
|
( $four_hundred_year_cycle_00 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the 400 year cycle<-400,0,400,...,2000>, day number within 400 year cycle<1 - 146097> '$four_hundred_year_cycle_00'.\n\n\n"; |
|
1
|
|
|
|
|
122
|
|
2116
|
102
|
100
|
|
|
|
341
|
( is_valid_400_year_cycle($four_hundred_year_cycle_00) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the 400 year cycle<-400,0,400,...,2000>, day number within 400 year cycle<1 - 146097> '$four_hundred_year_cycle_00'.\n\n\n"; |
|
4
|
|
|
|
|
450
|
|
2117
|
|
|
|
|
|
|
|
2118
|
98
|
100
|
|
|
|
332
|
( ref(\$day_number_in_400_year_cycle_00) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day number within the 400 year cycle '$day_number_in_400_year_cycle_00'.\n\n\n"; |
|
1
|
|
|
|
|
98
|
|
2119
|
97
|
100
|
|
|
|
294
|
( $day_number_in_400_year_cycle_00 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the day number within the 400 year cycle '$day_number_in_400_year_cycle_00'.\n\n\n"; |
|
1
|
|
|
|
|
125
|
|
2120
|
96
|
100
|
100
|
|
|
1043
|
( ( $day_number_in_400_year_cycle_00 =~ m/^(\d{1,6})$/ ) && ( $1 > 0 ) && ( $1 <= $NUMBER_OF_DAYS_IN_400_YEAR_CYCLE ) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer (1 - 146097) for the day number within the 400 year cycle '$day_number_in_400_year_cycle_00'.\n\n\n"; |
|
3
|
|
100
|
|
|
401
|
|
2121
|
|
|
|
|
|
|
|
2122
|
|
|
|
|
|
|
|
2123
|
93
|
|
|
|
|
704
|
my $current_day_count_00 = $day_number_in_400_year_cycle_00; |
2124
|
93
|
|
|
|
|
119
|
my $iii_002; |
2125
|
93
|
|
|
|
|
268
|
for ( $iii_002=0; $iii_002<$NUMBER_OF_YEAR_PHASES; $iii_002++ ) |
2126
|
|
|
|
|
|
|
{ |
2127
|
30735
|
|
|
|
|
163241
|
my $days_in_this_year_00 = get_num_days_in_year($iii_002); |
2128
|
30735
|
100
|
|
|
|
58425
|
if ( $current_day_count_00 > $days_in_this_year_00 ) |
2129
|
|
|
|
|
|
|
{ |
2130
|
30642
|
|
|
|
|
110177
|
$current_day_count_00 -= $days_in_this_year_00; |
2131
|
|
|
|
|
|
|
} |
2132
|
|
|
|
|
|
|
else |
2133
|
|
|
|
|
|
|
{ |
2134
|
93
|
|
|
|
|
254
|
last; |
2135
|
|
|
|
|
|
|
} |
2136
|
|
|
|
|
|
|
} |
2137
|
|
|
|
|
|
|
|
2138
|
93
|
|
|
|
|
473
|
my ( $month_num_11, $day_of_month_11, $year_num_11, $day_of_week_11 ) = date_only_parse(day_number_within_year_to_date($iii_002, $current_day_count_00)); |
2139
|
93
|
|
|
|
|
236
|
$year_num_11 += $four_hundred_year_cycle_00; |
2140
|
|
|
|
|
|
|
|
2141
|
93
|
|
|
|
|
379
|
my $date_from_num_01 = "${month_num_11}/${day_of_month_11}/${year_num_11}"; |
2142
|
|
|
|
|
|
|
|
2143
|
93
|
|
|
|
|
230
|
return ( format_date( $date_from_num_01 ) ); |
2144
|
|
|
|
|
|
|
} |
2145
|
|
|
|
|
|
|
|
2146
|
|
|
|
|
|
|
|
2147
|
|
|
|
|
|
|
|
2148
|
|
|
|
|
|
|
|
2149
|
|
|
|
|
|
|
############################################################################### |
2150
|
|
|
|
|
|
|
# Usage : Function is overloaded to accept EITHER a date string OR a date |
2151
|
|
|
|
|
|
|
# : component. |
2152
|
|
|
|
|
|
|
# : 1) Date string, |
2153
|
|
|
|
|
|
|
# : format_date( SCALAR, ) |
2154
|
|
|
|
|
|
|
# : 2) Month, dayofmonth, year, |
2155
|
|
|
|
|
|
|
# : format_date( SCALAR, SCALAR, SCALAR, ) |
2156
|
|
|
|
|
|
|
# Purpose : Formats dates |
2157
|
|
|
|
|
|
|
# Returns : date string if successful |
2158
|
|
|
|
|
|
|
# Parameters : 1) ( date string in any format, ) |
2159
|
|
|
|
|
|
|
# : OR |
2160
|
|
|
|
|
|
|
# : 2) ( month, day of month, year, ) |
2161
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
2162
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
2163
|
|
|
|
|
|
|
# : - It does NOT output time, time zone or any other time parameter |
2164
|
|
|
|
|
|
|
# : other than a CONSTANT 12noon time when a time component is |
2165
|
|
|
|
|
|
|
# : included in the format. |
2166
|
|
|
|
|
|
|
# : - Format options |
2167
|
|
|
|
|
|
|
# : -> 'mm/dd/yyyy' |
2168
|
|
|
|
|
|
|
# : 'A' -> 'Mon Sep 17 12:00:00 2007' (time component is ALWAYS 12 noon) |
2169
|
|
|
|
|
|
|
# : 'B' -> 'September 17, 2007' |
2170
|
|
|
|
|
|
|
# : 'C' -> '17 September, 2007' |
2171
|
|
|
|
|
|
|
# : 'D' -> 'YYYY-MM-DD' |
2172
|
|
|
|
|
|
|
# See Also : N/A |
2173
|
|
|
|
|
|
|
############################################################################### |
2174
|
|
|
|
|
|
|
sub format_date |
2175
|
|
|
|
|
|
|
{ |
2176
|
|
|
|
|
|
|
|
2177
|
|
|
|
|
|
|
|
2178
|
|
|
|
|
|
|
# Incoming Inspection |
2179
|
441
|
100
|
100
|
441
|
1
|
22855
|
( ( @_ > 0 ) && ( @_ < 5 ) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Should have a date string and an optional format field, or a list of month,dayofmonth,year and an optional format field. '@_'.\n\n\n"; |
|
2
|
|
|
|
|
256
|
|
2180
|
|
|
|
|
|
|
|
2181
|
|
|
|
|
|
|
|
2182
|
439
|
|
|
|
|
918
|
my $format_selection_00 = ''; |
2183
|
439
|
|
|
|
|
543
|
my ($mmonth_00, $dday_00, $yyear_00, $day_of_week_04); |
2184
|
|
|
|
|
|
|
# Parsing date string with optional format selection |
2185
|
439
|
100
|
100
|
|
|
2002
|
if (( @_ == 1 ) || ( @_ == 2 ) ) |
2186
|
|
|
|
|
|
|
{ |
2187
|
382
|
100
|
|
|
|
1312
|
( ref(\$_[0]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the date string. '$_[0]'.\n\n\n"; |
|
1
|
|
|
|
|
134
|
|
2188
|
381
|
100
|
|
|
|
1025
|
( $_[0] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the date string '$_[0]'.\n\n\n"; |
|
1
|
|
|
|
|
101
|
|
2189
|
380
|
100
|
|
|
|
1033
|
( date_only_parse($_[0]) ) or croak "\n\n ($0) '${\(caller(0))[3]}' date string, '$_[0]', cannot be parsed.\n\n\n"; |
|
14
|
|
|
|
|
2077
|
|
2190
|
366
|
|
|
|
|
600
|
my $date_in_02; |
2191
|
366
|
100
|
|
|
|
840
|
if ( @_ == 1 ) |
2192
|
|
|
|
|
|
|
{ |
2193
|
360
|
|
|
|
|
649
|
$date_in_02 = $_[0]; |
2194
|
|
|
|
|
|
|
} |
2195
|
|
|
|
|
|
|
else |
2196
|
|
|
|
|
|
|
{ |
2197
|
6
|
100
|
|
|
|
25
|
( ref(\$_[1]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the desired date format. '$_[1]'.\n\n\n"; |
|
1
|
|
|
|
|
185
|
|
2198
|
5
|
100
|
|
|
|
20
|
( $_[1] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the desired date format '$_[1]'.\n\n\n"; |
|
1
|
|
|
|
|
152
|
|
2199
|
4
|
|
|
|
|
13
|
( $date_in_02, $format_selection_00 ) = @_; |
2200
|
|
|
|
|
|
|
} |
2201
|
364
|
|
|
|
|
1075
|
($mmonth_00, $dday_00, $yyear_00, $day_of_week_04) = date_only_parse($date_in_02); |
2202
|
|
|
|
|
|
|
} |
2203
|
|
|
|
|
|
|
# Individual date components with optional format selection |
2204
|
|
|
|
|
|
|
else |
2205
|
|
|
|
|
|
|
{ |
2206
|
57
|
100
|
|
|
|
196
|
( ref(\$_[0]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month '$_[0]'.\n\n\n"; |
|
2
|
|
|
|
|
225
|
|
2207
|
55
|
100
|
|
|
|
167
|
( $_[0] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the month '$_[0]'.\n\n\n"; |
|
2
|
|
|
|
|
296
|
|
2208
|
53
|
100
|
|
|
|
123
|
( is_valid_month($_[0]) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a valid month '$_[0]'.\n\n\n"; |
|
6
|
|
|
|
|
831
|
|
2209
|
|
|
|
|
|
|
|
2210
|
47
|
100
|
|
|
|
171
|
( ref(\$_[2]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year number '$_[2]'.\n\n\n"; |
|
2
|
|
|
|
|
239
|
|
2211
|
45
|
100
|
|
|
|
137
|
( $_[2] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the year number '$_[2]'.\n\n\n"; |
|
2
|
|
|
|
|
261
|
|
2212
|
43
|
100
|
|
|
|
121
|
( is_valid_year($_[2]) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the year number '$_[2]'.\n\n\n"; |
|
1
|
|
|
|
|
137
|
|
2213
|
|
|
|
|
|
|
|
2214
|
42
|
100
|
|
|
|
127
|
( ref(\$_[1]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day of month '$_[1]'.\n\n\n"; |
|
2
|
|
|
|
|
212
|
|
2215
|
40
|
100
|
|
|
|
491
|
( $_[1] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the day of month '$_[1]'.\n\n\n"; |
|
2
|
|
|
|
|
290
|
|
2216
|
38
|
100
|
|
|
|
115
|
( is_valid_day_of_month($_[0], $_[1], $_[2]) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value for the day of month (1-31) '$_[1]'.\n\n\n"; |
|
2
|
|
|
|
|
280
|
|
2217
|
|
|
|
|
|
|
|
2218
|
36
|
|
|
|
|
150
|
($mmonth_00, $dday_00, $yyear_00 ) = ( $_[0], $_[1], $_[2] ); |
2219
|
36
|
|
|
|
|
203
|
$day_of_week_04 = get_numeric_day_of_week( $mmonth_00, $dday_00, $yyear_00 ); |
2220
|
36
|
100
|
|
|
|
121
|
if ( @_ == 4 ) |
2221
|
|
|
|
|
|
|
{ |
2222
|
12
|
100
|
|
|
|
41
|
( ref(\$_[3]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the desired date format. '$_[3]'.\n\n\n"; |
|
1
|
|
|
|
|
151
|
|
2223
|
11
|
100
|
|
|
|
28
|
( $_[3] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the desired date format '$_[3]'.\n\n\n"; |
|
1
|
|
|
|
|
229
|
|
2224
|
10
|
|
|
|
|
23
|
$format_selection_00 = $_[3]; |
2225
|
|
|
|
|
|
|
} |
2226
|
|
|
|
|
|
|
} |
2227
|
|
|
|
|
|
|
|
2228
|
398
|
|
|
|
|
1219
|
$mmonth_00 = set_month_to_month_number($mmonth_00); |
2229
|
|
|
|
|
|
|
|
2230
|
398
|
|
|
|
|
647
|
my $formatted_date_00; |
2231
|
|
|
|
|
|
|
# '12/30/1999' |
2232
|
398
|
100
|
|
|
|
1194
|
if ( uc($format_selection_00) eq '' ) # default format |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
2233
|
|
|
|
|
|
|
{ |
2234
|
384
|
|
|
|
|
5181
|
$formatted_date_00 = sprintf "%02d/%02d/%d", $mmonth_00, $dday_00, $yyear_00; |
2235
|
|
|
|
|
|
|
} |
2236
|
|
|
|
|
|
|
# 'Sun Feb 29 12:00:00 1604' |
2237
|
|
|
|
|
|
|
elsif ( uc($format_selection_00) eq 'A' ) |
2238
|
|
|
|
|
|
|
{ |
2239
|
6
|
|
|
|
|
23
|
my $day_of_week_abbreviated_00 = set_day_to_day_name_abbrev( $day_of_week_04 ); |
2240
|
6
|
|
|
|
|
17
|
my $month_abbreviated_00 = set_month_to_month_name_abbrev( $mmonth_00 ); |
2241
|
6
|
|
|
|
|
47
|
$formatted_date_00 = sprintf "%3s %3s %2d 12:00:00 %d", $day_of_week_abbreviated_00, $month_abbreviated_00, $dday_00, $yyear_00; |
2242
|
|
|
|
|
|
|
} |
2243
|
|
|
|
|
|
|
# 'September 17, 2007' |
2244
|
|
|
|
|
|
|
elsif ( uc($format_selection_00) eq 'B' ) |
2245
|
|
|
|
|
|
|
{ |
2246
|
1
|
|
|
|
|
6
|
my $month_12 = set_month_to_month_name_full( $mmonth_00 ); |
2247
|
1
|
|
|
|
|
12
|
$formatted_date_00 = sprintf "%3s %01d, %d", $month_12, $dday_00, $yyear_00; |
2248
|
|
|
|
|
|
|
} |
2249
|
|
|
|
|
|
|
# '17 September, 2007' |
2250
|
|
|
|
|
|
|
elsif ( uc($format_selection_00) eq 'C' ) |
2251
|
|
|
|
|
|
|
{ |
2252
|
1
|
|
|
|
|
4
|
my $month_14 = set_month_to_month_name_full( $mmonth_00 ); |
2253
|
1
|
|
|
|
|
9
|
$formatted_date_00 = sprintf "%01d %3s, %d", $dday_00, $month_14, $yyear_00; |
2254
|
|
|
|
|
|
|
} |
2255
|
|
|
|
|
|
|
# 'YYYY-MM-DD' (ex: 2007-09-01 ) |
2256
|
|
|
|
|
|
|
elsif ( uc($format_selection_00) eq 'D' ) |
2257
|
|
|
|
|
|
|
{ |
2258
|
5
|
|
|
|
|
15
|
my $month_15 = set_month_to_month_number( $mmonth_00 ); |
2259
|
5
|
|
|
|
|
31
|
$formatted_date_00 = sprintf "%d-%02d-%02d", $yyear_00, $month_15, $dday_00; |
2260
|
|
|
|
|
|
|
} |
2261
|
|
|
|
|
|
|
else |
2262
|
|
|
|
|
|
|
{ |
2263
|
1
|
|
|
|
|
4
|
croak "\n\n ($0) '${\(caller(0))[3]}' This date format selection, '$format_selection_00', is not recognized. Refer to documentation for allowable options.\n\n\n"; |
|
1
|
|
|
|
|
135
|
|
2264
|
|
|
|
|
|
|
} |
2265
|
|
|
|
|
|
|
|
2266
|
397
|
|
|
|
|
2649
|
return ($formatted_date_00); |
2267
|
|
|
|
|
|
|
} |
2268
|
|
|
|
|
|
|
|
2269
|
|
|
|
|
|
|
|
2270
|
|
|
|
|
|
|
|
2271
|
|
|
|
|
|
|
|
2272
|
|
|
|
|
|
|
############################################################################### |
2273
|
|
|
|
|
|
|
# Usage : get_first_of_month_day_of_week( SCALAR, SCALAR ) |
2274
|
|
|
|
|
|
|
# Purpose : get the day of the week for the first of the month for a specified month/year combination |
2275
|
|
|
|
|
|
|
# Returns : - day of the week (1-7) if successful |
2276
|
|
|
|
|
|
|
# Parameters : ( |
2277
|
|
|
|
|
|
|
# : alpha or month integer<1-12>, |
2278
|
|
|
|
|
|
|
# : year integer, |
2279
|
|
|
|
|
|
|
# : ) |
2280
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
2281
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
2282
|
|
|
|
|
|
|
# : - <1 for Mon ... 7 for Sun> |
2283
|
|
|
|
|
|
|
# See Also : N/A |
2284
|
|
|
|
|
|
|
############################################################################### |
2285
|
|
|
|
|
|
|
sub get_first_of_month_day_of_week |
2286
|
|
|
|
|
|
|
{ |
2287
|
|
|
|
|
|
|
my ( |
2288
|
220833
|
|
|
220833
|
1
|
367604
|
$month_input_09, |
2289
|
|
|
|
|
|
|
$year_in_05, |
2290
|
|
|
|
|
|
|
) |
2291
|
|
|
|
|
|
|
= @_; |
2292
|
|
|
|
|
|
|
|
2293
|
|
|
|
|
|
|
|
2294
|
|
|
|
|
|
|
# Incoming Inspection |
2295
|
220833
|
|
|
|
|
260943
|
my $num_input_params_28 = 2; |
2296
|
220833
|
100
|
|
|
|
539732
|
( @_ == $num_input_params_28) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_28 parameter(s), (month, year). '@_'.\n\n\n"; |
|
2
|
|
|
|
|
382
|
|
2297
|
|
|
|
|
|
|
|
2298
|
220831
|
100
|
|
|
|
552323
|
( ref(\$month_input_09) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month '$month_input_09'.\n\n\n"; |
|
1
|
|
|
|
|
127
|
|
2299
|
220830
|
100
|
|
|
|
534229
|
( $month_input_09 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the month '$month_input_09'.\n\n\n"; |
|
1
|
|
|
|
|
133
|
|
2300
|
220829
|
100
|
|
|
|
421789
|
( is_valid_month($month_input_09) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a valid month '$month_input_09'.\n\n\n"; |
|
4
|
|
|
|
|
514
|
|
2301
|
|
|
|
|
|
|
|
2302
|
220825
|
100
|
|
|
|
583741
|
( ref(\$year_in_05) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year number '$year_in_05'.\n\n\n"; |
|
1
|
|
|
|
|
147
|
|
2303
|
220824
|
100
|
|
|
|
531974
|
( $year_in_05 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the year number '$year_in_05'.\n\n\n"; |
|
1
|
|
|
|
|
147
|
|
2304
|
220823
|
100
|
|
|
|
404363
|
( is_valid_year($year_in_05) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the year number '$year_in_05'.\n\n\n"; |
|
1
|
|
|
|
|
152
|
|
2305
|
|
|
|
|
|
|
|
2306
|
|
|
|
|
|
|
|
2307
|
220822
|
|
|
|
|
476111
|
my $month_num_12 = set_month_to_month_number($month_input_09); |
2308
|
220822
|
|
|
|
|
504318
|
my $year_phase_02 = get_year_phase( $year_in_05 ); |
2309
|
220822
|
|
|
|
|
810457
|
my $first_of_month_day_of_week_00 = set_day_to_day_number($DAY_OF_WEEK_ON_FIRST_OF_YEAR{$year_phase_02}); |
2310
|
220822
|
100
|
|
|
|
667149
|
if ( !(is_leap_year($year_in_05) ) ) |
2311
|
|
|
|
|
|
|
{ |
2312
|
167262
|
|
|
|
|
282977
|
foreach ($month_num_12) |
2313
|
|
|
|
|
|
|
{ |
2314
|
|
|
|
|
|
|
SWITCH: |
2315
|
|
|
|
|
|
|
{ |
2316
|
167262
|
100
|
|
|
|
174123
|
if ( $_ == 2 ) { $first_of_month_day_of_week_00 += 31; last SWITCH; } |
|
167262
|
|
|
|
|
361997
|
|
|
13943
|
|
|
|
|
17647
|
|
|
13943
|
|
|
|
|
38275
|
|
2317
|
153319
|
100
|
|
|
|
298539
|
if ( $_ == 3 ) { $first_of_month_day_of_week_00 += 59; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 28; |
|
13938
|
|
|
|
|
19121
|
|
|
13938
|
|
|
|
|
37265
|
|
2318
|
139381
|
100
|
|
|
|
272542
|
if ( $_ == 4 ) { $first_of_month_day_of_week_00 += 90; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 28 + 31; |
|
13938
|
|
|
|
|
17069
|
|
|
13938
|
|
|
|
|
36228
|
|
2319
|
125443
|
100
|
|
|
|
225066
|
if ( $_ == 5 ) { $first_of_month_day_of_week_00 += 120; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 28 + 31 + 30; |
|
13938
|
|
|
|
|
16378
|
|
|
13938
|
|
|
|
|
36990
|
|
2320
|
111505
|
100
|
|
|
|
228678
|
if ( $_ == 6 ) { $first_of_month_day_of_week_00 += 151; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 28 + 31 + 30 + 31; |
|
13938
|
|
|
|
|
18923
|
|
|
13938
|
|
|
|
|
42488
|
|
2321
|
97567
|
100
|
|
|
|
176955
|
if ( $_ == 7 ) { $first_of_month_day_of_week_00 += 181; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 28 + 31 + 30 + 31 + 30; |
|
13938
|
|
|
|
|
19141
|
|
|
13938
|
|
|
|
|
42294
|
|
2322
|
83629
|
100
|
|
|
|
143839
|
if ( $_ == 8 ) { $first_of_month_day_of_week_00 += 212; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 28 + 31 + 30 + 31 + 30 + 31; |
|
13938
|
|
|
|
|
29139
|
|
|
13938
|
|
|
|
|
58362
|
|
2323
|
69691
|
100
|
|
|
|
123591
|
if ( $_ == 9 ) { $first_of_month_day_of_week_00 += 243; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31; |
|
13938
|
|
|
|
|
18744
|
|
|
13938
|
|
|
|
|
41035
|
|
2324
|
55753
|
100
|
|
|
|
113301
|
if ( $_ == 10 ) { $first_of_month_day_of_week_00 += 273; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30; |
|
13938
|
|
|
|
|
21503
|
|
|
13938
|
|
|
|
|
48671
|
|
2325
|
41815
|
100
|
|
|
|
92626
|
if ( $_ == 11 ) { $first_of_month_day_of_week_00 += 304; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31; |
|
13938
|
|
|
|
|
20864
|
|
|
13938
|
|
|
|
|
51621
|
|
2326
|
27877
|
100
|
|
|
|
74760
|
if ( $_ == 12 ) { $first_of_month_day_of_week_00 += 334; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30; |
|
13938
|
|
|
|
|
17918
|
|
|
13938
|
|
|
|
|
44525
|
|
2327
|
|
|
|
|
|
|
} |
2328
|
|
|
|
|
|
|
} |
2329
|
|
|
|
|
|
|
} |
2330
|
|
|
|
|
|
|
else |
2331
|
|
|
|
|
|
|
{ |
2332
|
53560
|
|
|
|
|
91851
|
foreach ($month_num_12) |
2333
|
|
|
|
|
|
|
{ |
2334
|
|
|
|
|
|
|
SWITCH: |
2335
|
|
|
|
|
|
|
{ |
2336
|
53560
|
100
|
|
|
|
58013
|
if ( $_ == 2 ) { $first_of_month_day_of_week_00 += 31; last SWITCH; } |
|
53560
|
|
|
|
|
118563
|
|
|
4464
|
|
|
|
|
6116
|
|
|
4464
|
|
|
|
|
12092
|
|
2337
|
49096
|
100
|
|
|
|
91191
|
if ( $_ == 3 ) { $first_of_month_day_of_week_00 += 60; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 29; |
|
4463
|
|
|
|
|
5553
|
|
|
4463
|
|
|
|
|
11691
|
|
2338
|
44633
|
100
|
|
|
|
88533
|
if ( $_ == 4 ) { $first_of_month_day_of_week_00 += 91; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 29 + 31; |
|
4463
|
|
|
|
|
5353
|
|
|
4463
|
|
|
|
|
12043
|
|
2339
|
40170
|
100
|
|
|
|
101365
|
if ( $_ == 5 ) { $first_of_month_day_of_week_00 += 121; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 29 + 31 + 30; |
|
4463
|
|
|
|
|
5544
|
|
|
4463
|
|
|
|
|
14037
|
|
2340
|
35707
|
100
|
|
|
|
69802
|
if ( $_ == 6 ) { $first_of_month_day_of_week_00 += 152; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 29 + 31 + 30 + 31; |
|
4463
|
|
|
|
|
5839
|
|
|
4463
|
|
|
|
|
12484
|
|
2341
|
31244
|
100
|
|
|
|
60620
|
if ( $_ == 7 ) { $first_of_month_day_of_week_00 += 182; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 29 + 31 + 30 + 31 + 30; |
|
4463
|
|
|
|
|
5707
|
|
|
4463
|
|
|
|
|
12142
|
|
2342
|
26781
|
100
|
|
|
|
70280
|
if ( $_ == 8 ) { $first_of_month_day_of_week_00 += 213; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 29 + 31 + 30 + 31 + 30 + 31; |
|
4464
|
|
|
|
|
6578
|
|
|
4464
|
|
|
|
|
23503
|
|
2343
|
22317
|
100
|
|
|
|
57474
|
if ( $_ == 9 ) { $first_of_month_day_of_week_00 += 244; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31; |
|
4463
|
|
|
|
|
9337
|
|
|
4463
|
|
|
|
|
12183
|
|
2344
|
17854
|
100
|
|
|
|
39633
|
if ( $_ == 10 ) { $first_of_month_day_of_week_00 += 274; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30; |
|
4463
|
|
|
|
|
6124
|
|
|
4463
|
|
|
|
|
11901
|
|
2345
|
13391
|
100
|
|
|
|
27669
|
if ( $_ == 11 ) { $first_of_month_day_of_week_00 += 305; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31; |
|
4463
|
|
|
|
|
5891
|
|
|
4463
|
|
|
|
|
12178
|
|
2346
|
8928
|
100
|
|
|
|
24892
|
if ( $_ == 12 ) { $first_of_month_day_of_week_00 += 335; last SWITCH; } # $first_of_month_day_of_week_00 += 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30; |
|
4464
|
|
|
|
|
7372
|
|
|
4464
|
|
|
|
|
12911
|
|
2347
|
|
|
|
|
|
|
} |
2348
|
|
|
|
|
|
|
} |
2349
|
|
|
|
|
|
|
} |
2350
|
|
|
|
|
|
|
|
2351
|
|
|
|
|
|
|
|
2352
|
|
|
|
|
|
|
# Map day of week to 0-6 |
2353
|
220822
|
|
|
|
|
388578
|
$first_of_month_day_of_week_00 %= 7; |
2354
|
|
|
|
|
|
|
|
2355
|
|
|
|
|
|
|
# Map day of week '0' to '7' |
2356
|
220822
|
100
|
|
|
|
460394
|
if ( $first_of_month_day_of_week_00 == 0 ) |
2357
|
|
|
|
|
|
|
{ |
2358
|
31650
|
|
|
|
|
41304
|
$first_of_month_day_of_week_00 = 7; |
2359
|
|
|
|
|
|
|
} |
2360
|
|
|
|
|
|
|
|
2361
|
220822
|
|
|
|
|
5148127
|
return ( $first_of_month_day_of_week_00 ); |
2362
|
|
|
|
|
|
|
} |
2363
|
|
|
|
|
|
|
|
2364
|
|
|
|
|
|
|
|
2365
|
|
|
|
|
|
|
|
2366
|
|
|
|
|
|
|
|
2367
|
|
|
|
|
|
|
############################################################################### |
2368
|
|
|
|
|
|
|
# Usage : Function is overloaded to accept one of two date input types |
2369
|
|
|
|
|
|
|
# : 1) Date string |
2370
|
|
|
|
|
|
|
# : get_numeric_day_of_week( SCALAR ) |
2371
|
|
|
|
|
|
|
# : 2) Month, dayofmonth, year |
2372
|
|
|
|
|
|
|
# : get_numeric_day_of_week( SCALAR, SCALAR, SCALAR ) |
2373
|
|
|
|
|
|
|
# Purpose : get numeric day of week (1-7) for given date |
2374
|
|
|
|
|
|
|
# Returns : - day of week number if successful |
2375
|
|
|
|
|
|
|
# Parameters : 1) ( date string in any format ) |
2376
|
|
|
|
|
|
|
# : OR |
2377
|
|
|
|
|
|
|
# : 2) ( month, day of month, year ) |
2378
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
2379
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
2380
|
|
|
|
|
|
|
# : - <1 for Mon ... 7 for Sun> |
2381
|
|
|
|
|
|
|
# See Also : N/A |
2382
|
|
|
|
|
|
|
############################################################################### |
2383
|
|
|
|
|
|
|
sub get_numeric_day_of_week |
2384
|
|
|
|
|
|
|
{ |
2385
|
|
|
|
|
|
|
|
2386
|
|
|
|
|
|
|
|
2387
|
|
|
|
|
|
|
# Incoming Inspection |
2388
|
15243
|
100
|
100
|
15243
|
1
|
87225
|
( ( @_ == 1 ) || ( @_ == 3 ) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Should have either a date string, or a list of month,dayofmonth,year. '@_'.\n\n\n"; |
|
2
|
|
|
|
|
237
|
|
2389
|
|
|
|
|
|
|
|
2390
|
|
|
|
|
|
|
|
2391
|
15241
|
|
|
|
|
19051
|
my ( $month_input_10, $day_of_month_in_02, $year_in_06, $day_of_week_12 ); |
2392
|
|
|
|
|
|
|
# Parsing date string and is recursive one time into this function |
2393
|
15241
|
100
|
|
|
|
36956
|
if ( @_ == 1 ) |
2394
|
|
|
|
|
|
|
{ |
2395
|
219
|
100
|
|
|
|
825
|
( ref(\$_[0]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the date string. '$_[0]'.\n\n\n"; |
|
2
|
|
|
|
|
260
|
|
2396
|
217
|
100
|
|
|
|
626
|
( $_[0] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the date string '$_[0]'.\n\n\n"; |
|
1
|
|
|
|
|
97
|
|
2397
|
|
|
|
|
|
|
|
2398
|
216
|
|
|
|
|
544
|
($month_input_10, $day_of_month_in_02, $year_in_06, $day_of_week_12 ) = date_only_parse($_[0]); |
2399
|
216
|
100
|
|
|
|
718
|
if ( $day_of_week_12 ) |
2400
|
|
|
|
|
|
|
{ |
2401
|
215
|
|
|
|
|
514
|
return ( $day_of_week_12 ); |
2402
|
|
|
|
|
|
|
} |
2403
|
|
|
|
|
|
|
else |
2404
|
|
|
|
|
|
|
{ |
2405
|
1
|
|
|
|
|
4
|
croak "\n\n ($0) '${\(caller(0))[3]}' date string, '$_[0]', cannot be parsed.\n\n\n"; |
|
1
|
|
|
|
|
105
|
|
2406
|
|
|
|
|
|
|
} |
2407
|
|
|
|
|
|
|
} |
2408
|
|
|
|
|
|
|
# Individual date components |
2409
|
|
|
|
|
|
|
else |
2410
|
|
|
|
|
|
|
{ |
2411
|
15022
|
100
|
|
|
|
40444
|
( ref(\$_[0]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the month '$_[0]'.\n\n\n"; |
|
1
|
|
|
|
|
150
|
|
2412
|
15021
|
100
|
|
|
|
35965
|
( $_[0] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the month '$_[0]'.\n\n\n"; |
|
1
|
|
|
|
|
160
|
|
2413
|
15020
|
100
|
|
|
|
37813
|
( is_valid_month($_[0]) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a valid month '$_[0]'.\n\n\n"; |
|
3
|
|
|
|
|
483
|
|
2414
|
|
|
|
|
|
|
|
2415
|
15017
|
100
|
|
|
|
39385
|
( ref(\$_[2]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the year number '$_[2]'.\n\n\n"; |
|
1
|
|
|
|
|
160
|
|
2416
|
15016
|
100
|
|
|
|
39675
|
( $_[2] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the year number '$_[2]'.\n\n\n"; |
|
1
|
|
|
|
|
123
|
|
2417
|
15015
|
100
|
|
|
|
32708
|
( is_valid_year($_[2]) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the year number '$_[2]'.\n\n\n"; |
|
1
|
|
|
|
|
141
|
|
2418
|
|
|
|
|
|
|
|
2419
|
15014
|
100
|
|
|
|
36764
|
( ref(\$_[1]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the day of month '$_[1]'.\n\n\n"; |
|
1
|
|
|
|
|
143
|
|
2420
|
15013
|
100
|
|
|
|
34012
|
( $_[1] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the day of month '$_[1]'.\n\n\n"; |
|
1
|
|
|
|
|
163
|
|
2421
|
15012
|
100
|
|
|
|
37927
|
( is_valid_day_of_month($_[0], $_[1], $_[2]) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value for the day of month (1-31) '$_[1]'.\n\n\n"; |
|
16
|
|
|
|
|
2446
|
|
2422
|
|
|
|
|
|
|
|
2423
|
14996
|
|
|
|
|
78335
|
($month_input_10, $day_of_month_in_02, $year_in_06 ) = ( $_[0], $_[1], $_[2] ); |
2424
|
|
|
|
|
|
|
} |
2425
|
|
|
|
|
|
|
|
2426
|
|
|
|
|
|
|
|
2427
|
14996
|
|
|
|
|
33198
|
my $month_num_14 = set_month_to_month_number($month_input_10); |
2428
|
14996
|
|
|
|
|
40369
|
my $year_phase_03 = get_year_phase( $year_in_06 ); |
2429
|
|
|
|
|
|
|
|
2430
|
14996
|
|
|
|
|
76867
|
my $first_of_month_day_of_week_02 = $NUMERIC_DAY_OF_WEEK_ON_FIRST_OF_MONTH{$year_phase_03}{$month_num_14} + $day_of_month_in_02 - 1; |
2431
|
14996
|
|
|
|
|
201584
|
$first_of_month_day_of_week_02 %= 7; |
2432
|
|
|
|
|
|
|
|
2433
|
|
|
|
|
|
|
# Map day of week to 0-6 |
2434
|
14996
|
|
|
|
|
20013
|
$first_of_month_day_of_week_02 %= 7; |
2435
|
|
|
|
|
|
|
|
2436
|
|
|
|
|
|
|
# Map day of week '0' to '7' |
2437
|
14996
|
100
|
|
|
|
29940
|
if ( $first_of_month_day_of_week_02 == 0 ) |
2438
|
|
|
|
|
|
|
{ |
2439
|
1440
|
|
|
|
|
2093
|
$first_of_month_day_of_week_02 = 7; |
2440
|
|
|
|
|
|
|
} |
2441
|
|
|
|
|
|
|
|
2442
|
14996
|
|
|
|
|
50372
|
return ( $first_of_month_day_of_week_02 ); |
2443
|
|
|
|
|
|
|
} |
2444
|
|
|
|
|
|
|
|
2445
|
|
|
|
|
|
|
|
2446
|
|
|
|
|
|
|
|
2447
|
|
|
|
|
|
|
|
2448
|
|
|
|
|
|
|
############################################################################### |
2449
|
|
|
|
|
|
|
# Usage : get_month_from_string( SCALAR ) |
2450
|
|
|
|
|
|
|
# Purpose : extract month from given date string |
2451
|
|
|
|
|
|
|
# Returns : month number if successful |
2452
|
|
|
|
|
|
|
# Parameters : date string in any format |
2453
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
2454
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
2455
|
|
|
|
|
|
|
# : - 1 for Jan ... 12 for Dec |
2456
|
|
|
|
|
|
|
# See Also : N/A |
2457
|
|
|
|
|
|
|
############################################################################### |
2458
|
|
|
|
|
|
|
sub get_month_from_string |
2459
|
|
|
|
|
|
|
{ |
2460
|
|
|
|
|
|
|
|
2461
|
|
|
|
|
|
|
|
2462
|
|
|
|
|
|
|
# Incoming Inspection |
2463
|
40
|
100
|
|
40
|
1
|
15031
|
( @_ == 1 ) or croak "\n\n ($0) '${\(caller(0))[3]}' Should have a date string to be parsed. '@_'.\n\n\n"; |
|
28
|
|
|
|
|
3932
|
|
2464
|
|
|
|
|
|
|
|
2465
|
12
|
100
|
|
|
|
42
|
( ref(\$_[0]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the date string. '$_[0]'.\n\n\n"; |
|
2
|
|
|
|
|
214
|
|
2466
|
10
|
100
|
|
|
|
28
|
( $_[0] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the date string '$_[0]'.\n\n\n"; |
|
1
|
|
|
|
|
160
|
|
2467
|
|
|
|
|
|
|
|
2468
|
|
|
|
|
|
|
|
2469
|
9
|
|
|
|
|
22
|
my ($month_input_15, $day_of_month_15, $year_15, $day_of_week_15) = date_only_parse( $_[0] ); |
2470
|
9
|
100
|
|
|
|
30
|
if ( $month_input_15 eq '' ) |
2471
|
|
|
|
|
|
|
{ |
2472
|
1
|
|
|
|
|
4
|
croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the date from the input date string '$_[0]'.\n\n\n"; |
|
1
|
|
|
|
|
173
|
|
2473
|
|
|
|
|
|
|
} |
2474
|
|
|
|
|
|
|
else |
2475
|
|
|
|
|
|
|
{ |
2476
|
8
|
|
|
|
|
39
|
return ( $month_input_15 ); |
2477
|
|
|
|
|
|
|
} |
2478
|
|
|
|
|
|
|
|
2479
|
|
|
|
|
|
|
} |
2480
|
|
|
|
|
|
|
|
2481
|
|
|
|
|
|
|
|
2482
|
|
|
|
|
|
|
|
2483
|
|
|
|
|
|
|
|
2484
|
|
|
|
|
|
|
############################################################################### |
2485
|
|
|
|
|
|
|
# Usage : get_dayofmonth_from_string( SCALAR ) |
2486
|
|
|
|
|
|
|
# Purpose : extract day of month from given date string |
2487
|
|
|
|
|
|
|
# Returns : day of month if successful |
2488
|
|
|
|
|
|
|
# Parameters : date string in any format |
2489
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
2490
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
2491
|
|
|
|
|
|
|
# See Also : N/A |
2492
|
|
|
|
|
|
|
############################################################################### |
2493
|
|
|
|
|
|
|
sub get_dayofmonth_from_string |
2494
|
|
|
|
|
|
|
{ |
2495
|
|
|
|
|
|
|
|
2496
|
|
|
|
|
|
|
|
2497
|
|
|
|
|
|
|
# Incoming Inspection |
2498
|
40
|
100
|
|
40
|
1
|
16381
|
( @_ == 1 ) or croak "\n\n ($0) '${\(caller(0))[3]}' Should have a date string to be parsed. '@_'.\n\n\n"; |
|
28
|
|
|
|
|
4055
|
|
2499
|
|
|
|
|
|
|
|
2500
|
12
|
100
|
|
|
|
43
|
( ref(\$_[0]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the date string. '$_[0]'.\n\n\n"; |
|
2
|
|
|
|
|
241
|
|
2501
|
10
|
100
|
|
|
|
28
|
( $_[0] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the date string '$_[0]'.\n\n\n"; |
|
1
|
|
|
|
|
122
|
|
2502
|
|
|
|
|
|
|
|
2503
|
|
|
|
|
|
|
|
2504
|
9
|
|
|
|
|
28
|
my ($month_input_18, $day_of_month_18, $year_18, $day_of_week_18) = date_only_parse( $_[0] ); |
2505
|
9
|
100
|
|
|
|
30
|
if ( !(defined ($day_of_month_18) ) ) |
2506
|
|
|
|
|
|
|
{ |
2507
|
1
|
|
|
|
|
5
|
croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the date from the input date string '$_[0]'.\n\n\n"; |
|
1
|
|
|
|
|
133
|
|
2508
|
|
|
|
|
|
|
} |
2509
|
|
|
|
|
|
|
else |
2510
|
|
|
|
|
|
|
{ |
2511
|
8
|
|
|
|
|
44
|
return ( $day_of_month_18 ); |
2512
|
|
|
|
|
|
|
} |
2513
|
|
|
|
|
|
|
|
2514
|
|
|
|
|
|
|
} |
2515
|
|
|
|
|
|
|
|
2516
|
|
|
|
|
|
|
|
2517
|
|
|
|
|
|
|
|
2518
|
|
|
|
|
|
|
|
2519
|
|
|
|
|
|
|
############################################################################### |
2520
|
|
|
|
|
|
|
# Usage : get_year_from_string( SCALAR ) |
2521
|
|
|
|
|
|
|
# Purpose : extract year from given date string |
2522
|
|
|
|
|
|
|
# Returns : year if successful |
2523
|
|
|
|
|
|
|
# Parameters : date string in any format |
2524
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
2525
|
|
|
|
|
|
|
# Comments : - Handles all years, even negative years (aka BC) |
2526
|
|
|
|
|
|
|
# See Also : N/A |
2527
|
|
|
|
|
|
|
############################################################################### |
2528
|
|
|
|
|
|
|
sub get_year_from_string |
2529
|
|
|
|
|
|
|
{ |
2530
|
|
|
|
|
|
|
|
2531
|
|
|
|
|
|
|
|
2532
|
|
|
|
|
|
|
# Incoming Inspection |
2533
|
40
|
100
|
|
40
|
1
|
26156
|
( @_ == 1 ) or croak "\n\n ($0) '${\(caller(0))[3]}' Should have a date string to be parsed. '@_'.\n\n\n"; |
|
28
|
|
|
|
|
9622
|
|
2534
|
|
|
|
|
|
|
|
2535
|
12
|
100
|
|
|
|
50
|
( ref(\$_[0]) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the date string. '$_[0]'.\n\n\n"; |
|
2
|
|
|
|
|
317
|
|
2536
|
10
|
100
|
|
|
|
34
|
( $_[0] ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the date string '$_[0]'.\n\n\n"; |
|
1
|
|
|
|
|
444
|
|
2537
|
|
|
|
|
|
|
|
2538
|
|
|
|
|
|
|
|
2539
|
9
|
|
|
|
|
32
|
my ($month_input_14, $day_of_month_14, $year_14, $day_of_week_14) = date_only_parse( $_[0] ); |
2540
|
9
|
100
|
|
|
|
32
|
if ( !(defined ($year_14) ) ) |
2541
|
|
|
|
|
|
|
{ |
2542
|
1
|
|
|
|
|
7
|
croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the date from the input date string '$_[0]'.\n\n\n"; |
|
1
|
|
|
|
|
178
|
|
2543
|
|
|
|
|
|
|
} |
2544
|
|
|
|
|
|
|
else |
2545
|
|
|
|
|
|
|
{ |
2546
|
8
|
|
|
|
|
39
|
return ( $year_14 ); |
2547
|
|
|
|
|
|
|
} |
2548
|
|
|
|
|
|
|
|
2549
|
|
|
|
|
|
|
} |
2550
|
|
|
|
|
|
|
|
2551
|
|
|
|
|
|
|
|
2552
|
|
|
|
|
|
|
|
2553
|
|
|
|
|
|
|
|
2554
|
|
|
|
|
|
|
############################################################################### |
2555
|
|
|
|
|
|
|
# Usage : compare_year1_and_year2( SCALAR, SCALAR ) |
2556
|
|
|
|
|
|
|
# Purpose : compares two dates to find which one is the later year, months and days are ignored |
2557
|
|
|
|
|
|
|
# Returns : - '1' if the FIRST year is LATER than the second |
2558
|
|
|
|
|
|
|
# : - '-1' if the FIRST year is EARLIER than the second |
2559
|
|
|
|
|
|
|
# : - '0' if both years are the same |
2560
|
|
|
|
|
|
|
# Parameters : ( |
2561
|
|
|
|
|
|
|
# : date ONE in any format, |
2562
|
|
|
|
|
|
|
# : date TWO in any format |
2563
|
|
|
|
|
|
|
# : ) |
2564
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
2565
|
|
|
|
|
|
|
# Comments : N/A |
2566
|
|
|
|
|
|
|
# See Also : N/A |
2567
|
|
|
|
|
|
|
############################################################################### |
2568
|
|
|
|
|
|
|
sub compare_year1_and_year2 |
2569
|
|
|
|
|
|
|
{ |
2570
|
|
|
|
|
|
|
my ( |
2571
|
30
|
|
|
30
|
1
|
18243
|
$date_one_03, |
2572
|
|
|
|
|
|
|
$date_two_03 |
2573
|
|
|
|
|
|
|
) |
2574
|
|
|
|
|
|
|
= @_; |
2575
|
|
|
|
|
|
|
|
2576
|
|
|
|
|
|
|
|
2577
|
|
|
|
|
|
|
# Incoming Inspection |
2578
|
30
|
|
|
|
|
57
|
my $num_input_params_30 = 2; |
2579
|
30
|
100
|
|
|
|
127
|
( @_ == $num_input_params_30) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_30 parameters ('date1' and date2). '@_'.\n\n\n"; |
|
8
|
|
|
|
|
1307
|
|
2580
|
|
|
|
|
|
|
|
2581
|
22
|
100
|
|
|
|
91
|
( ref(\$date_one_03) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR first parameter for the first date '$date_one_03'.\n\n\n"; |
|
1
|
|
|
|
|
130
|
|
2582
|
21
|
100
|
|
|
|
77
|
( ref(\$date_two_03) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR second parameter for the second date '$date_two_03'.\n\n\n"; |
|
1
|
|
|
|
|
127
|
|
2583
|
|
|
|
|
|
|
|
2584
|
20
|
100
|
|
|
|
65
|
( $date_one_03 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the first date '$date_one_03'.\n\n\n"; |
|
1
|
|
|
|
|
120
|
|
2585
|
19
|
100
|
|
|
|
57
|
( $date_two_03 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the second date '$date_two_03'.\n\n\n"; |
|
1
|
|
|
|
|
119
|
|
2586
|
|
|
|
|
|
|
|
2587
|
18
|
100
|
|
|
|
45
|
( date_only_parse($date_one_03) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the date from the input date1 string '$date_one_03'.\n\n\n"; |
|
1
|
|
|
|
|
145
|
|
2588
|
17
|
100
|
|
|
|
36
|
( date_only_parse($date_two_03) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the date from the input date2 string '$date_two_03'.\n\n\n"; |
|
1
|
|
|
|
|
184
|
|
2589
|
|
|
|
|
|
|
|
2590
|
|
|
|
|
|
|
|
2591
|
16
|
|
|
|
|
46
|
my ( $date1_month_num_06, $date1_day_of_month_06, $date1_year_num_06, $date1_day_of_week_06 ) = date_only_parse($date_one_03); |
2592
|
16
|
|
|
|
|
123
|
my ( $date2_month_num_06, $date2_day_of_month_06, $date2_year_num_06, $date2_day_of_week_06 ) = date_only_parse($date_two_03); |
2593
|
|
|
|
|
|
|
|
2594
|
16
|
100
|
|
|
|
68
|
if ( $date1_year_num_06 == $date2_year_num_06 ) |
|
|
100
|
|
|
|
|
|
2595
|
|
|
|
|
|
|
{ |
2596
|
4
|
|
|
|
|
33
|
return ( '0' ); |
2597
|
|
|
|
|
|
|
} |
2598
|
|
|
|
|
|
|
elsif ( $date1_year_num_06 > $date2_year_num_06 ) |
2599
|
|
|
|
|
|
|
{ |
2600
|
5
|
|
|
|
|
41
|
return ( '1' ); |
2601
|
|
|
|
|
|
|
} |
2602
|
|
|
|
|
|
|
else |
2603
|
|
|
|
|
|
|
{ |
2604
|
7
|
|
|
|
|
54
|
return ( '-1' ); |
2605
|
|
|
|
|
|
|
} |
2606
|
|
|
|
|
|
|
|
2607
|
|
|
|
|
|
|
} |
2608
|
|
|
|
|
|
|
|
2609
|
|
|
|
|
|
|
|
2610
|
|
|
|
|
|
|
|
2611
|
|
|
|
|
|
|
|
2612
|
|
|
|
|
|
|
############################################################################### |
2613
|
|
|
|
|
|
|
# Usage : year1_to_year2_delta( SCALAR, SCALAR ) |
2614
|
|
|
|
|
|
|
# Purpose : calculates the difference in WHOLE years between two dates (basically it truncates the date difference to whole years) |
2615
|
|
|
|
|
|
|
# Returns : integer year difference if successful |
2616
|
|
|
|
|
|
|
# Parameters : ( |
2617
|
|
|
|
|
|
|
# : date ONE in any format, |
2618
|
|
|
|
|
|
|
# : date TWO in any format |
2619
|
|
|
|
|
|
|
# : ) |
2620
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
2621
|
|
|
|
|
|
|
# Comments : - Difference is positive if date1 > date2 |
2622
|
|
|
|
|
|
|
# : - Difference is negative if date1 < date2 |
2623
|
|
|
|
|
|
|
# : - Examples Date1 = 4/5/1977 and Date2 = 11/16/1975 equals ONE complete year difference |
2624
|
|
|
|
|
|
|
# See Also : N/A |
2625
|
|
|
|
|
|
|
############################################################################### |
2626
|
|
|
|
|
|
|
sub year1_to_year2_delta |
2627
|
|
|
|
|
|
|
{ |
2628
|
|
|
|
|
|
|
my ( |
2629
|
57
|
|
|
57
|
1
|
8503
|
$date_one_04, |
2630
|
|
|
|
|
|
|
$date_two_04 |
2631
|
|
|
|
|
|
|
) |
2632
|
|
|
|
|
|
|
= @_; |
2633
|
|
|
|
|
|
|
|
2634
|
|
|
|
|
|
|
|
2635
|
|
|
|
|
|
|
# Incoming Inspection |
2636
|
57
|
|
|
|
|
107
|
my $num_input_params_31 = 2; |
2637
|
57
|
100
|
|
|
|
185
|
( @_ == $num_input_params_31) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_31 parameters ('date1' and date2). '@_'.\n\n\n"; |
|
8
|
|
|
|
|
1136
|
|
2638
|
|
|
|
|
|
|
|
2639
|
49
|
100
|
|
|
|
195
|
( ref(\$date_one_04) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR first parameter for the first date '$date_one_04'.\n\n\n"; |
|
1
|
|
|
|
|
126
|
|
2640
|
48
|
100
|
|
|
|
169
|
( ref(\$date_two_04) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR second parameter for the second date '$date_two_04'.\n\n\n"; |
|
1
|
|
|
|
|
122
|
|
2641
|
|
|
|
|
|
|
|
2642
|
47
|
100
|
|
|
|
126
|
( $date_one_04 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the first date '$date_one_04'.\n\n\n"; |
|
1
|
|
|
|
|
128
|
|
2643
|
46
|
100
|
|
|
|
112
|
( $date_two_04 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the second date '$date_two_04'.\n\n\n"; |
|
1
|
|
|
|
|
372
|
|
2644
|
|
|
|
|
|
|
|
2645
|
45
|
100
|
|
|
|
104
|
( date_only_parse($date_one_04) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the date from the input date1 string '$date_one_04'.\n\n\n"; |
|
1
|
|
|
|
|
141
|
|
2646
|
44
|
100
|
|
|
|
92
|
( date_only_parse($date_two_04) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the date from the input date2 string '$date_two_04'.\n\n\n"; |
|
1
|
|
|
|
|
158
|
|
2647
|
|
|
|
|
|
|
|
2648
|
|
|
|
|
|
|
|
2649
|
43
|
|
|
|
|
100
|
my ( $date1_month_num_07, $date1_day_of_month_07, $date1_year_num_07, $date1_day_of_week_07 ) = date_only_parse($date_one_04); |
2650
|
43
|
|
|
|
|
115
|
my ( $date2_month_num_07, $date2_day_of_month_07, $date2_year_num_07, $date2_day_of_week_07 ) = date_only_parse($date_two_04); |
2651
|
|
|
|
|
|
|
|
2652
|
43
|
|
|
|
|
81
|
my $year_difference_00; |
2653
|
43
|
100
|
|
|
|
107
|
if ( $date1_year_num_07 == $date2_year_num_07 ) |
2654
|
|
|
|
|
|
|
{ |
2655
|
3
|
|
|
|
|
7
|
$year_difference_00 = '0'; |
2656
|
|
|
|
|
|
|
} |
2657
|
|
|
|
|
|
|
else |
2658
|
|
|
|
|
|
|
{ |
2659
|
40
|
|
|
|
|
60
|
$year_difference_00 = $date1_year_num_07 - $date2_year_num_07; |
2660
|
|
|
|
|
|
|
} |
2661
|
|
|
|
|
|
|
|
2662
|
|
|
|
|
|
|
|
2663
|
43
|
|
|
|
|
85
|
$date1_month_num_07 = set_month_to_month_number($date1_month_num_07); |
2664
|
43
|
|
|
|
|
102
|
$date2_month_num_07 = set_month_to_month_number($date2_month_num_07); |
2665
|
|
|
|
|
|
|
|
2666
|
|
|
|
|
|
|
|
2667
|
43
|
|
|
|
|
92
|
my $date1_is_leap_year = 'no'; |
2668
|
43
|
100
|
|
|
|
105
|
if ( is_leap_year($date1_year_num_07) ) |
2669
|
|
|
|
|
|
|
{ |
2670
|
21
|
|
|
|
|
34
|
$date1_is_leap_year = 'yes'; |
2671
|
|
|
|
|
|
|
} |
2672
|
|
|
|
|
|
|
|
2673
|
43
|
|
|
|
|
71
|
my $date2_is_leap_year = 'no'; |
2674
|
43
|
100
|
|
|
|
83
|
if ( is_leap_year($date2_year_num_07) ) |
2675
|
|
|
|
|
|
|
{ |
2676
|
19
|
|
|
|
|
31
|
$date2_is_leap_year = 'yes'; |
2677
|
|
|
|
|
|
|
} |
2678
|
|
|
|
|
|
|
|
2679
|
|
|
|
|
|
|
|
2680
|
43
|
100
|
|
|
|
139
|
if ( $year_difference_00 > 0 ) |
|
|
100
|
|
|
|
|
|
2681
|
|
|
|
|
|
|
{ |
2682
|
18
|
100
|
100
|
|
|
111
|
if ( $date1_month_num_07 < $date2_month_num_07 ) |
|
|
100
|
|
|
|
|
|
2683
|
|
|
|
|
|
|
{ |
2684
|
1
|
|
|
|
|
4
|
$year_difference_00--; |
2685
|
|
|
|
|
|
|
} |
2686
|
|
|
|
|
|
|
elsif ( ( $date1_month_num_07 == $date2_month_num_07 ) && ( $date1_day_of_month_07 < $date2_day_of_month_07 ) ) |
2687
|
|
|
|
|
|
|
{ |
2688
|
3
|
|
|
|
|
6
|
$year_difference_00--; |
2689
|
|
|
|
|
|
|
} |
2690
|
|
|
|
|
|
|
|
2691
|
|
|
|
|
|
|
# Leap Year Adjustments |
2692
|
|
|
|
|
|
|
# whole year whole year |
2693
|
|
|
|
|
|
|
# Date1 Date2 current fix |
2694
|
|
|
|
|
|
|
# 28 28 YES YES |
2695
|
|
|
|
|
|
|
# 28 28(9) YES YES |
2696
|
|
|
|
|
|
|
# 28 29 no YES (to be adjusted UP) |
2697
|
|
|
|
|
|
|
# 28(9) 28 YES no (to be adjusted DOWN) |
2698
|
|
|
|
|
|
|
# 28(9) 28(9) YES YES |
2699
|
|
|
|
|
|
|
# 28(9) 29 no no |
2700
|
|
|
|
|
|
|
# 29 28 YES YES |
2701
|
|
|
|
|
|
|
# 29 28(9) YES YES |
2702
|
|
|
|
|
|
|
# 29 29 YES YES |
2703
|
18
|
100
|
100
|
|
|
130
|
if ( ( $date1_is_leap_year eq 'no' ) && ( $date2_is_leap_year eq 'yes' ) ) |
|
|
100
|
100
|
|
|
|
|
2704
|
|
|
|
|
|
|
{ |
2705
|
4
|
100
|
100
|
|
|
20
|
if ( ( $date1_day_of_month_07 == 28 ) && ( $date2_day_of_month_07 == 29 ) ) |
2706
|
|
|
|
|
|
|
{ |
2707
|
1
|
|
|
|
|
3
|
$year_difference_00++; |
2708
|
|
|
|
|
|
|
} |
2709
|
|
|
|
|
|
|
} |
2710
|
|
|
|
|
|
|
elsif ( ( $date1_is_leap_year eq 'yes' ) && ( $date2_is_leap_year eq 'no' ) ) |
2711
|
|
|
|
|
|
|
{ |
2712
|
4
|
100
|
100
|
|
|
22
|
if ( ( $date1_day_of_month_07 == 28 ) && ( $date2_day_of_month_07 == 28 ) ) |
2713
|
|
|
|
|
|
|
{ |
2714
|
1
|
|
|
|
|
3
|
$year_difference_00--; |
2715
|
|
|
|
|
|
|
} |
2716
|
|
|
|
|
|
|
} |
2717
|
|
|
|
|
|
|
} |
2718
|
|
|
|
|
|
|
elsif ( $year_difference_00 < 0 ) |
2719
|
|
|
|
|
|
|
{ |
2720
|
22
|
100
|
100
|
|
|
127
|
if ( $date1_month_num_07 > $date2_month_num_07 ) |
|
|
100
|
|
|
|
|
|
2721
|
|
|
|
|
|
|
{ |
2722
|
3
|
|
|
|
|
7
|
$year_difference_00++; |
2723
|
|
|
|
|
|
|
} |
2724
|
|
|
|
|
|
|
elsif ( ( $date1_month_num_07 == $date2_month_num_07 ) && ( $date1_day_of_month_07 > $date2_day_of_month_07 ) ) |
2725
|
|
|
|
|
|
|
{ |
2726
|
5
|
|
|
|
|
11
|
$year_difference_00++; |
2727
|
|
|
|
|
|
|
} |
2728
|
|
|
|
|
|
|
|
2729
|
|
|
|
|
|
|
# Leap Year Adjustments |
2730
|
|
|
|
|
|
|
# whole year whole year |
2731
|
|
|
|
|
|
|
# Date1 Date2 current fix |
2732
|
|
|
|
|
|
|
# 28 28 YES YES |
2733
|
|
|
|
|
|
|
# 28 28(9) YES no (to be adjusted UP) |
2734
|
|
|
|
|
|
|
# 28 29 YES YES |
2735
|
|
|
|
|
|
|
# 28(9) 28 YES YES |
2736
|
|
|
|
|
|
|
# 28(9) 28(9) YES YES |
2737
|
|
|
|
|
|
|
# 28(9) 29 YES YES |
2738
|
|
|
|
|
|
|
# 29 28 no YES (to be adjusted DOWN) |
2739
|
|
|
|
|
|
|
# 29 28(9) no no |
2740
|
|
|
|
|
|
|
# 29 29 YES YES |
2741
|
22
|
100
|
100
|
|
|
156
|
if ( ( $date1_is_leap_year eq 'no' ) && ( $date2_is_leap_year eq 'yes' ) ) |
|
|
100
|
100
|
|
|
|
|
2742
|
|
|
|
|
|
|
{ |
2743
|
5
|
100
|
100
|
|
|
35
|
if ( ( $date1_day_of_month_07 == 28 ) && ( $date2_day_of_month_07 == 28 ) ) |
2744
|
|
|
|
|
|
|
{ |
2745
|
1
|
|
|
|
|
3
|
$year_difference_00++; |
2746
|
|
|
|
|
|
|
} |
2747
|
|
|
|
|
|
|
} |
2748
|
|
|
|
|
|
|
elsif ( ( $date1_is_leap_year eq 'yes' ) && ( $date2_is_leap_year eq 'no' ) ) |
2749
|
|
|
|
|
|
|
{ |
2750
|
7
|
100
|
100
|
|
|
33
|
if ( ( $date1_day_of_month_07 == 29 ) && ( $date2_day_of_month_07 == 28 ) ) |
2751
|
|
|
|
|
|
|
{ |
2752
|
1
|
|
|
|
|
2
|
$year_difference_00--; |
2753
|
|
|
|
|
|
|
} |
2754
|
|
|
|
|
|
|
} |
2755
|
|
|
|
|
|
|
} |
2756
|
|
|
|
|
|
|
|
2757
|
|
|
|
|
|
|
# Set year difference to string '0' if it is zero |
2758
|
43
|
100
|
|
|
|
102
|
if ( $year_difference_00 == 0 ) |
2759
|
|
|
|
|
|
|
{ |
2760
|
10
|
|
|
|
|
13
|
$year_difference_00 = '0'; |
2761
|
|
|
|
|
|
|
} |
2762
|
|
|
|
|
|
|
|
2763
|
43
|
|
|
|
|
315
|
return( $year_difference_00 ); |
2764
|
|
|
|
|
|
|
} |
2765
|
|
|
|
|
|
|
|
2766
|
|
|
|
|
|
|
|
2767
|
|
|
|
|
|
|
|
2768
|
|
|
|
|
|
|
|
2769
|
|
|
|
|
|
|
############################################################################### |
2770
|
|
|
|
|
|
|
# Usage : date_offset_in_years( SCALAR, SCALAR ) |
2771
|
|
|
|
|
|
|
# Purpose : find a date in the future or past offset by the number of YEARS from the given date |
2772
|
|
|
|
|
|
|
# Returns : - date of the day offset from the given date if successful |
2773
|
|
|
|
|
|
|
# Parameters : ( |
2774
|
|
|
|
|
|
|
# : date in any format, |
2775
|
|
|
|
|
|
|
# : number of WHOLE offset years, positive is future date, negative is past date, zero is current date (no offset) |
2776
|
|
|
|
|
|
|
# : ) |
2777
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
2778
|
|
|
|
|
|
|
# Comments : There are two exceptions where the new month/dayofmonth do NOT match the original |
2779
|
|
|
|
|
|
|
# : - Feb 29 in a leap year maps to Feb 28 in a NON leap year |
2780
|
|
|
|
|
|
|
# : - Feb 28 in a NON leap year maps to Feb 29 in a leap year |
2781
|
|
|
|
|
|
|
# See Also : N/A |
2782
|
|
|
|
|
|
|
############################################################################### |
2783
|
|
|
|
|
|
|
sub date_offset_in_years |
2784
|
|
|
|
|
|
|
{ |
2785
|
|
|
|
|
|
|
my ( |
2786
|
34
|
|
|
34
|
1
|
11697
|
$date_in_03, |
2787
|
|
|
|
|
|
|
$date_delta_years_00 |
2788
|
|
|
|
|
|
|
) |
2789
|
|
|
|
|
|
|
= @_; |
2790
|
|
|
|
|
|
|
|
2791
|
|
|
|
|
|
|
|
2792
|
|
|
|
|
|
|
# Incoming Inspection |
2793
|
34
|
|
|
|
|
69
|
my $num_input_params_32 = 2; |
2794
|
34
|
100
|
|
|
|
135
|
( @_ == $num_input_params_32) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_32 parameter(s), a date string followed by the number of offset days. '@_'.\n\n\n"; |
|
3
|
|
|
|
|
1945
|
|
2795
|
|
|
|
|
|
|
|
2796
|
31
|
100
|
|
|
|
130
|
( ref(\$date_in_03) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the date string '$date_in_03'.\n\n\n"; |
|
1
|
|
|
|
|
128
|
|
2797
|
30
|
100
|
|
|
|
104
|
( $date_in_03 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the date string '$date_in_03'.\n\n\n"; |
|
1
|
|
|
|
|
155
|
|
2798
|
29
|
100
|
|
|
|
88
|
( date_only_parse($date_in_03) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot parse the date from the input date string '$date_in_03'.\n\n\n"; |
|
2
|
|
|
|
|
357
|
|
2799
|
|
|
|
|
|
|
|
2800
|
27
|
100
|
|
|
|
94
|
( ref(\$date_delta_years_00) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the number of WHOLE offset years '$date_delta_years_00'.\n\n\n"; |
|
1
|
|
|
|
|
150
|
|
2801
|
26
|
100
|
|
|
|
219
|
( $date_delta_years_00 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the number of WHOLE offset years '$date_delta_years_00'.\n\n\n"; |
|
1
|
|
|
|
|
175
|
|
2802
|
25
|
100
|
|
|
|
124
|
( $date_delta_years_00 =~ m/^\-{0,1}\d+$/ ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the number of WHOLE offset years '$date_delta_years_00'.\n\n\n"; |
|
1
|
|
|
|
|
207
|
|
2803
|
|
|
|
|
|
|
|
2804
|
|
|
|
|
|
|
|
2805
|
24
|
100
|
|
|
|
65
|
if ( $date_delta_years_00 == 0 ) |
2806
|
|
|
|
|
|
|
{ |
2807
|
1
|
|
|
|
|
5
|
return ( format_date( $date_in_03 ) ); |
2808
|
|
|
|
|
|
|
} |
2809
|
|
|
|
|
|
|
|
2810
|
|
|
|
|
|
|
|
2811
|
23
|
|
|
|
|
54
|
my ( $date1_month_num_08, $date1_day_of_month_08, $date1_year_num_08, $date1_day_of_week_08 ) = date_only_parse($date_in_03); |
2812
|
|
|
|
|
|
|
|
2813
|
|
|
|
|
|
|
|
2814
|
23
|
|
|
|
|
64
|
my $offset_year_01 = $date1_year_num_08 + $date_delta_years_00; |
2815
|
|
|
|
|
|
|
|
2816
|
|
|
|
|
|
|
# Handle case where leap year (Feb 29) is to be mapped to a NON leap year (Feb 28) |
2817
|
23
|
|
|
|
|
40
|
my $mapped_to_end_of_month = $date1_day_of_month_08; |
2818
|
23
|
100
|
|
|
|
61
|
if ( !is_leap_year( $offset_year_01 ) ) |
|
|
100
|
|
|
|
|
|
2819
|
|
|
|
|
|
|
{ |
2820
|
14
|
100
|
100
|
|
|
74
|
if ( ( $date1_month_num_08 == 2 ) && ( $date1_day_of_month_08 == 29 ) ) |
2821
|
|
|
|
|
|
|
{ |
2822
|
2
|
|
|
|
|
5
|
$mapped_to_end_of_month = 28; |
2823
|
|
|
|
|
|
|
} |
2824
|
|
|
|
|
|
|
} |
2825
|
|
|
|
|
|
|
|
2826
|
|
|
|
|
|
|
# Handle case where NON leap year (Feb 28) is to be mapped to a leap year (Feb 29) |
2827
|
|
|
|
|
|
|
elsif ( !is_leap_year( $date1_year_num_08 ) ) |
2828
|
|
|
|
|
|
|
{ |
2829
|
5
|
100
|
100
|
|
|
33
|
if ( ( $date1_month_num_08 == 2 ) && ( $date1_day_of_month_08 == 28 ) ) |
2830
|
|
|
|
|
|
|
{ |
2831
|
2
|
|
|
|
|
5
|
$mapped_to_end_of_month = 29; |
2832
|
|
|
|
|
|
|
} |
2833
|
|
|
|
|
|
|
} |
2834
|
|
|
|
|
|
|
|
2835
|
23
|
|
|
|
|
94
|
return( format_date( $date1_month_num_08, $mapped_to_end_of_month, $offset_year_01 ) ); |
2836
|
|
|
|
|
|
|
} |
2837
|
|
|
|
|
|
|
|
2838
|
|
|
|
|
|
|
|
2839
|
|
|
|
|
|
|
|
2840
|
|
|
|
|
|
|
|
2841
|
|
|
|
|
|
|
############################################################################### |
2842
|
|
|
|
|
|
|
# Usage : number_of_weekdays_in_range( SCALAR, SCALAR ) |
2843
|
|
|
|
|
|
|
# Purpose : calculates the number of weekdays in the range of the two dates |
2844
|
|
|
|
|
|
|
# Returns : integer number of weekdays if successful |
2845
|
|
|
|
|
|
|
# Parameters : ( |
2846
|
|
|
|
|
|
|
# : date ONE in any format, |
2847
|
|
|
|
|
|
|
# : date TWO in any format |
2848
|
|
|
|
|
|
|
# : ) |
2849
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input |
2850
|
|
|
|
|
|
|
# Comments : - Difference is positive if date1 > date2 |
2851
|
|
|
|
|
|
|
# : - Difference is negative if date1 < date2 |
2852
|
|
|
|
|
|
|
# : - Friday to Saturday counts as ZERO days |
2853
|
|
|
|
|
|
|
# : - Friday to Sunday counts as ZERO days |
2854
|
|
|
|
|
|
|
# : - Friday to Monday counts as one day |
2855
|
|
|
|
|
|
|
# : - Tuesday to previous Wednesday counts as NEGATIVE four days |
2856
|
|
|
|
|
|
|
# See Also : N/A |
2857
|
|
|
|
|
|
|
############################################################################### |
2858
|
|
|
|
|
|
|
sub number_of_weekdays_in_range |
2859
|
|
|
|
|
|
|
{ |
2860
|
|
|
|
|
|
|
my ( |
2861
|
73
|
|
|
73
|
1
|
5766
|
$date_one_05, |
2862
|
|
|
|
|
|
|
$date_two_05 |
2863
|
|
|
|
|
|
|
) |
2864
|
|
|
|
|
|
|
= @_; |
2865
|
|
|
|
|
|
|
|
2866
|
|
|
|
|
|
|
|
2867
|
|
|
|
|
|
|
# Incoming Inspection |
2868
|
73
|
|
|
|
|
139
|
my $num_input_params_33 = 2; |
2869
|
73
|
100
|
|
|
|
270
|
( @_ == $num_input_params_33) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_33 parameters ('date1' and date2). '@_'.\n\n\n"; |
|
8
|
|
|
|
|
1106
|
|
2870
|
|
|
|
|
|
|
|
2871
|
65
|
100
|
|
|
|
270
|
( ref(\$date_one_05) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR first parameter for the first date '$date_one_05'.\n\n\n"; |
|
1
|
|
|
|
|
116
|
|
2872
|
64
|
100
|
|
|
|
231
|
( ref(\$date_two_05) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR second parameter for the second date '$date_two_05'.\n\n\n"; |
|
1
|
|
|
|
|
123
|
|
2873
|
|
|
|
|
|
|
|
2874
|
63
|
100
|
|
|
|
191
|
( $date_one_05 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the first date '$date_one_05'.\n\n\n"; |
|
1
|
|
|
|
|
126
|
|
2875
|
62
|
100
|
|
|
|
178
|
( $date_two_05 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the second date '$date_two_05'.\n\n\n"; |
|
1
|
|
|
|
|
130
|
|
2876
|
|
|
|
|
|
|
|
2877
|
61
|
100
|
|
|
|
164
|
( date_only_parse($date_one_05) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the date from the input date1 string '$date_one_05'.\n\n\n"; |
|
1
|
|
|
|
|
138
|
|
2878
|
60
|
100
|
|
|
|
119
|
( date_only_parse($date_two_05) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot extract the date from the input date2 string '$date_two_05'.\n\n\n"; |
|
1
|
|
|
|
|
160
|
|
2879
|
|
|
|
|
|
|
|
2880
|
|
|
|
|
|
|
|
2881
|
|
|
|
|
|
|
# Get count of ALL days in range as a starting point |
2882
|
59
|
|
|
|
|
188
|
my $number_of_days_in_range_00 = date1_to_date2_delta( $date_one_05, $date_two_05 ); |
2883
|
|
|
|
|
|
|
|
2884
|
|
|
|
|
|
|
# Get the number of weekdays in the range for the WHOLE weeks in the range |
2885
|
59
|
|
|
|
|
239
|
my $number_weekdays_00 = int( abs($number_of_days_in_range_00) / 7 ) * 5; |
2886
|
|
|
|
|
|
|
|
2887
|
|
|
|
|
|
|
# Get the remainder of weekdays in the range that is discarded by the previous variable |
2888
|
59
|
|
|
|
|
116
|
my $week_remainder_00 = abs( $number_of_days_in_range_00 ) % 7; |
2889
|
|
|
|
|
|
|
|
2890
|
59
|
|
|
|
|
159
|
my $current_dayofweek_00 = get_numeric_day_of_week($date_two_05); |
2891
|
|
|
|
|
|
|
# Cycle through the left over days in the range that do not form a WHOLE week and add them in into the total IF they are weekdays |
2892
|
59
|
|
|
|
|
274
|
for ( my $iii_004=0; $iii_004<$week_remainder_00; $iii_004++ ) |
2893
|
|
|
|
|
|
|
{ |
2894
|
139
|
100
|
|
|
|
268
|
if ( $number_of_days_in_range_00 > 0 ) # range is positive |
2895
|
|
|
|
|
|
|
{ |
2896
|
76
|
|
|
|
|
97
|
$current_dayofweek_00++; |
2897
|
76
|
100
|
|
|
|
155
|
if ( $current_dayofweek_00 > 7 ) |
2898
|
|
|
|
|
|
|
{ |
2899
|
20
|
|
|
|
|
27
|
$current_dayofweek_00 -= 7; |
2900
|
|
|
|
|
|
|
} |
2901
|
|
|
|
|
|
|
|
2902
|
76
|
100
|
|
|
|
171
|
if ( $current_dayofweek_00 < 6 ) # weekdays |
2903
|
|
|
|
|
|
|
{ |
2904
|
42
|
|
|
|
|
56
|
$number_weekdays_00++; |
2905
|
|
|
|
|
|
|
} |
2906
|
|
|
|
|
|
|
} |
2907
|
139
|
100
|
|
|
|
342
|
if ( $number_of_days_in_range_00 < 0 ) # range is negative |
2908
|
|
|
|
|
|
|
{ |
2909
|
63
|
|
|
|
|
63
|
$current_dayofweek_00--; |
2910
|
63
|
100
|
|
|
|
106
|
if ( $current_dayofweek_00 < 1 ) |
2911
|
|
|
|
|
|
|
{ |
2912
|
4
|
|
|
|
|
11
|
$current_dayofweek_00 += 7; |
2913
|
|
|
|
|
|
|
} |
2914
|
|
|
|
|
|
|
|
2915
|
63
|
100
|
|
|
|
140
|
if ( $current_dayofweek_00 < 6 ) # weekdays |
2916
|
|
|
|
|
|
|
{ |
2917
|
54
|
|
|
|
|
117
|
$number_weekdays_00++; |
2918
|
|
|
|
|
|
|
} |
2919
|
|
|
|
|
|
|
} |
2920
|
|
|
|
|
|
|
} |
2921
|
|
|
|
|
|
|
|
2922
|
|
|
|
|
|
|
|
2923
|
|
|
|
|
|
|
# Put correct sign to number of days in range |
2924
|
59
|
100
|
|
|
|
186
|
if ( $number_of_days_in_range_00 > 0 ) |
|
|
100
|
|
|
|
|
|
2925
|
|
|
|
|
|
|
{ |
2926
|
32
|
|
|
|
|
289
|
return( $number_weekdays_00 ); |
2927
|
|
|
|
|
|
|
} |
2928
|
|
|
|
|
|
|
elsif ( $number_of_days_in_range_00 < 0 ) |
2929
|
|
|
|
|
|
|
{ |
2930
|
24
|
|
|
|
|
255
|
return( -$number_weekdays_00 ); |
2931
|
|
|
|
|
|
|
} |
2932
|
|
|
|
|
|
|
else |
2933
|
|
|
|
|
|
|
{ |
2934
|
3
|
|
|
|
|
28
|
return( '0' ); |
2935
|
|
|
|
|
|
|
} |
2936
|
|
|
|
|
|
|
|
2937
|
|
|
|
|
|
|
} |
2938
|
|
|
|
|
|
|
|
2939
|
|
|
|
|
|
|
|
2940
|
|
|
|
|
|
|
|
2941
|
|
|
|
|
|
|
|
2942
|
|
|
|
|
|
|
############################################################################### |
2943
|
|
|
|
|
|
|
# Usage : date_offset_in_weekdays( SCALAR, SCALAR ) |
2944
|
|
|
|
|
|
|
# Purpose : find a WEEKDAY date in the future or past offset by the number of weekdays from the given starting WEEKDAY date |
2945
|
|
|
|
|
|
|
# Returns : - date of the WEEKDAY day offset from the given WEEKDAY date if successful |
2946
|
|
|
|
|
|
|
# Parameters : ( |
2947
|
|
|
|
|
|
|
# : WEEKDAY date in any format, |
2948
|
|
|
|
|
|
|
# : number of weekdays offset, positive is future date, negative is past date, zero is current date (no offset) |
2949
|
|
|
|
|
|
|
# : ) |
2950
|
|
|
|
|
|
|
# Throws : Throws exception for any invalid input INCLUDING weekend dates |
2951
|
|
|
|
|
|
|
# Comments : This effectively functions as if ALL weekend dates were removed |
2952
|
|
|
|
|
|
|
# : from the calendar. This function accepts ONLY weekday dates and |
2953
|
|
|
|
|
|
|
# : outputs ONLY weekday dates |
2954
|
|
|
|
|
|
|
# See Also : N/A |
2955
|
|
|
|
|
|
|
############################################################################### |
2956
|
|
|
|
|
|
|
sub date_offset_in_weekdays |
2957
|
|
|
|
|
|
|
{ |
2958
|
|
|
|
|
|
|
my ( |
2959
|
91
|
|
|
91
|
1
|
9487
|
$date_in_05, |
2960
|
|
|
|
|
|
|
$date_delta_01 |
2961
|
|
|
|
|
|
|
) |
2962
|
|
|
|
|
|
|
= @_; |
2963
|
|
|
|
|
|
|
|
2964
|
|
|
|
|
|
|
|
2965
|
|
|
|
|
|
|
# Incoming Inspection |
2966
|
91
|
|
|
|
|
181
|
my $num_input_params_36 = 2; |
2967
|
91
|
100
|
|
|
|
453
|
( @_ == $num_input_params_36) or croak "\n\n ($0) '${\(caller(0))[3]}' should have exactly $num_input_params_36 parameter(s), a date string followed by the number of offset days. '@_'.\n\n\n"; |
|
6
|
|
|
|
|
807
|
|
2968
|
|
|
|
|
|
|
|
2969
|
85
|
100
|
|
|
|
483
|
( ref(\$date_in_05) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the date string '$date_in_05'.\n\n\n"; |
|
1
|
|
|
|
|
115
|
|
2970
|
84
|
100
|
|
|
|
295
|
( $date_in_05 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty string for the date string '$date_in_05'.\n\n\n"; |
|
1
|
|
|
|
|
132
|
|
2971
|
83
|
100
|
|
|
|
229
|
( date_only_parse($date_in_05) ) or croak "\n\n ($0) '${\(caller(0))[3]}' Cannot parse the date from the input date string '$date_in_05'.\n\n\n"; |
|
3
|
|
|
|
|
441
|
|
2972
|
|
|
|
|
|
|
|
2973
|
80
|
100
|
|
|
|
318
|
( ref(\$date_delta_01) eq 'SCALAR' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a SCALAR parameter for the number of offset days '$date_delta_01'.\n\n\n"; |
|
1
|
|
|
|
|
155
|
|
2974
|
79
|
100
|
|
|
|
253
|
( $date_delta_01 ne '' ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects a NON-empty value for the number of offset days '$date_delta_01'.\n\n\n"; |
|
1
|
|
|
|
|
170
|
|
2975
|
78
|
100
|
|
|
|
416
|
( $date_delta_01 =~ m/^\-{0,1}\d+$/ ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects an integer value, positive, negative or zero, for the number of offset days '$date_delta_01'.\n\n\n"; |
|
1
|
|
|
|
|
239
|
|
2976
|
|
|
|
|
|
|
|
2977
|
|
|
|
|
|
|
|
2978
|
|
|
|
|
|
|
# Check that starting date is a WEEKDAY |
2979
|
77
|
|
|
|
|
242
|
my $day_of_week_16 = get_numeric_day_of_week($date_in_05); |
2980
|
|
|
|
|
|
|
|
2981
|
77
|
100
|
|
|
|
270
|
( $day_of_week_16 < 6 ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects the starting date, '$date_in_05', to be a WEEKDAY. It is incorrectly a ${\(set_day_to_day_name_full($day_of_week_16))}.\n\n\n"; |
|
1
|
|
|
|
|
9
|
|
|
1
|
|
|
|
|
4
|
|
2982
|
|
|
|
|
|
|
|
2983
|
76
|
|
|
|
|
121
|
my $past_future = 1; |
2984
|
76
|
100
|
|
|
|
234
|
if ( $date_delta_01 < 0 ) |
2985
|
|
|
|
|
|
|
{ |
2986
|
35
|
|
|
|
|
62
|
$past_future = -1; |
2987
|
|
|
|
|
|
|
} |
2988
|
|
|
|
|
|
|
|
2989
|
|
|
|
|
|
|
# 1 0 0 7/5 2 0 0 7/5 3 0 0 7/5 4 0 0 7/5 5 0 0 7/5 |
2990
|
|
|
|
|
|
|
# 1 1 1 int(7/5) 2 1 1 int(7/5) 3 1 1 int(7/5) 4 1 1 int(7/5) 5 1 3 int(7/5) + 2 |
2991
|
|
|
|
|
|
|
# 1 2 2 int(7/5) 2 2 2 int(7/5) 3 2 2 int(7/5) 4 2 4 int(7/5) + 2 5 2 4 int(7/5) + 2 |
2992
|
|
|
|
|
|
|
# 1 3 3 int(7/5) - 1 2 3 3 int(7/5) - 1 3 3 5 int(7/5) + 1 4 3 5 int(7/5) + 1 5 3 5 int(7/5) + 1 |
2993
|
|
|
|
|
|
|
# 1 4 4 int(7/5) - 1 2 4 6 int(7/5) + 1 3 4 6 int(7/5) + 1 4 4 6 int(7/5) + 1 5 4 6 int(7/5) + 1 |
2994
|
|
|
|
|
|
|
|
2995
|
|
|
|
|
|
|
# 1 0 0 7/5 2 0 0 7/5 3 0 0 7/5 4 0 0 7/5 5 0 0 7/5 |
2996
|
|
|
|
|
|
|
# 1 -1 -3 -int(abs(7/5)) - 2 2 -1 -1 -int(abs(7/5)) 3 -1 -1 -int(abs(7/5)) 4 -1 -1 -int(abs(7/5)) 5 -1 -1 -int(abs(7/5)) |
2997
|
|
|
|
|
|
|
# 1 -2 -4 -int(abs(7/5)) - 2 2 -2 -4 -int(abs(7/5)) - 2 3 -2 -2 -int(abs(7/5)) 4 -2 -2 -int(abs(7/5)) 5 -2 -2 -int(abs(7/5)) |
2998
|
|
|
|
|
|
|
# 1 -3 -5 -int(abs(7/5)) - 1 2 -3 -5 -int(abs(7/5)) - 1 3 -3 -5 -int(abs(7/5)) - 1 4 -3 -3 -int(abs(7/5)) + 1 5 -3 -3 -int(abs(7/5)) + 1 |
2999
|
|
|
|
|
|
|
# 1 -4 -6 -int(abs(7/5)) - 1 2 -4 -6 -int(abs(7/5)) - 1 3 -4 -6 -int(abs(7/5)) - 1 4 -4 -6 -int(abs(7/5)) - 1 5 -4 -4 -int(abs(7/5)) + 1 |
3000
|
|
|
|
|
|
|
|
3001
|
76
|
|
|
|
|
167
|
my $weekday_remainder = abs($date_delta_01) % 5; |
3002
|
76
|
|
|
|
|
122
|
my $num_days_effective = 'xxx'; |
3003
|
76
|
100
|
100
|
|
|
1583
|
if ( |
|
|
100
|
100
|
|
|
|
|
|
|
100
|
66
|
|
|
|
|
|
|
100
|
100
|
|
|
|
|
|
|
100
|
100
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
66
|
|
|
|
|
3004
|
|
|
|
|
|
|
( ( $day_of_week_16 == 1 ) && ( $date_delta_01 > 0 ) ) || |
3005
|
|
|
|
|
|
|
( ( $day_of_week_16 == 5 ) && ( $date_delta_01 < 0 ) ) |
3006
|
|
|
|
|
|
|
) |
3007
|
|
|
|
|
|
|
{ |
3008
|
15
|
|
|
|
|
35
|
foreach ( $weekday_remainder ) |
3009
|
|
|
|
|
|
|
{ |
3010
|
|
|
|
|
|
|
SWITCH: |
3011
|
|
|
|
|
|
|
{ |
3012
|
15
|
100
|
|
|
|
22
|
if ( $_ <= 2 ) { $num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ); last SWITCH; } |
|
15
|
|
|
|
|
39
|
|
|
10
|
|
|
|
|
38
|
|
|
10
|
|
|
|
|
39
|
|
3013
|
5
|
|
|
|
|
31
|
$num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ) - $past_future; |
3014
|
|
|
|
|
|
|
} |
3015
|
|
|
|
|
|
|
} |
3016
|
|
|
|
|
|
|
} |
3017
|
|
|
|
|
|
|
elsif ( |
3018
|
|
|
|
|
|
|
( ( $day_of_week_16 == 2 ) && ( $date_delta_01 > 0 ) ) || |
3019
|
|
|
|
|
|
|
( ( $day_of_week_16 == 4 ) && ( $date_delta_01 < 0 ) ) |
3020
|
|
|
|
|
|
|
) |
3021
|
|
|
|
|
|
|
{ |
3022
|
14
|
|
|
|
|
42
|
foreach ( $weekday_remainder ) |
3023
|
|
|
|
|
|
|
{ |
3024
|
|
|
|
|
|
|
SWITCH: |
3025
|
|
|
|
|
|
|
{ |
3026
|
14
|
100
|
|
|
|
23
|
if ( $_ <= 2 ) { $num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ); last SWITCH; } |
|
14
|
|
|
|
|
38
|
|
|
10
|
|
|
|
|
35
|
|
|
10
|
|
|
|
|
45
|
|
3027
|
4
|
100
|
|
|
|
14
|
if ( $_ == 3 ) { $num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ) - $past_future; last SWITCH; } |
|
2
|
|
|
|
|
8
|
|
|
2
|
|
|
|
|
10
|
|
3028
|
2
|
|
|
|
|
13
|
$num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ) + $past_future; |
3029
|
|
|
|
|
|
|
} |
3030
|
|
|
|
|
|
|
} |
3031
|
|
|
|
|
|
|
} |
3032
|
|
|
|
|
|
|
elsif ( |
3033
|
|
|
|
|
|
|
( ( $day_of_week_16 == 3 ) && ( $date_delta_01 > 0 ) ) || |
3034
|
|
|
|
|
|
|
( ( $day_of_week_16 == 3 ) && ( $date_delta_01 < 0 ) ) |
3035
|
|
|
|
|
|
|
) |
3036
|
|
|
|
|
|
|
{ |
3037
|
14
|
|
|
|
|
35
|
foreach ( $weekday_remainder ) |
3038
|
|
|
|
|
|
|
{ |
3039
|
|
|
|
|
|
|
SWITCH: |
3040
|
|
|
|
|
|
|
{ |
3041
|
14
|
100
|
|
|
|
22
|
if ( $_ <= 2 ) { $num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ); last SWITCH; } |
|
14
|
|
|
|
|
40
|
|
|
10
|
|
|
|
|
36
|
|
|
10
|
|
|
|
|
37
|
|
3042
|
4
|
|
|
|
|
21
|
$num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ) + $past_future; |
3043
|
|
|
|
|
|
|
} |
3044
|
|
|
|
|
|
|
} |
3045
|
|
|
|
|
|
|
} |
3046
|
|
|
|
|
|
|
elsif ( |
3047
|
|
|
|
|
|
|
( ( $day_of_week_16 == 4 ) && ( $date_delta_01 > 0 ) ) || |
3048
|
|
|
|
|
|
|
( ( $day_of_week_16 == 2 ) && ( $date_delta_01 < 0 ) ) |
3049
|
|
|
|
|
|
|
) |
3050
|
|
|
|
|
|
|
{ |
3051
|
14
|
|
|
|
|
35
|
foreach ( $weekday_remainder ) |
3052
|
|
|
|
|
|
|
{ |
3053
|
|
|
|
|
|
|
SWITCH: |
3054
|
|
|
|
|
|
|
{ |
3055
|
14
|
100
|
|
|
|
27
|
if ( $_ < 2 ) { $num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ); last SWITCH; } |
|
14
|
|
|
|
|
56
|
|
|
6
|
|
|
|
|
113
|
|
|
6
|
|
|
|
|
25
|
|
3056
|
8
|
100
|
|
|
|
22
|
if ( $_ == 2 ) { $num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ) + $past_future * 2; last SWITCH; } |
|
4
|
|
|
|
|
15
|
|
|
4
|
|
|
|
|
16
|
|
3057
|
4
|
|
|
|
|
24
|
$num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ) + $past_future; |
3058
|
|
|
|
|
|
|
} |
3059
|
|
|
|
|
|
|
} |
3060
|
|
|
|
|
|
|
} |
3061
|
|
|
|
|
|
|
elsif ( |
3062
|
|
|
|
|
|
|
( ( $day_of_week_16 == 5 ) && ( $date_delta_01 > 0 ) ) || |
3063
|
|
|
|
|
|
|
( ( $day_of_week_16 == 1 ) && ( $date_delta_01 < 0 ) ) |
3064
|
|
|
|
|
|
|
) |
3065
|
|
|
|
|
|
|
{ |
3066
|
14
|
|
|
|
|
36
|
foreach ( $weekday_remainder ) |
3067
|
|
|
|
|
|
|
{ |
3068
|
|
|
|
|
|
|
SWITCH: |
3069
|
|
|
|
|
|
|
{ |
3070
|
14
|
100
|
|
|
|
23
|
if ( $_ == 0 ) { $num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ); last SWITCH; } |
|
14
|
|
|
|
|
42
|
|
|
2
|
|
|
|
|
9
|
|
|
2
|
|
|
|
|
9
|
|
3071
|
12
|
100
|
|
|
|
31
|
if ( $_ == 1 ) { $num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ) + $past_future * 2; last SWITCH; } |
|
4
|
|
|
|
|
16
|
|
|
4
|
|
|
|
|
18
|
|
3072
|
8
|
100
|
|
|
|
20
|
if ( $_ == 2 ) { $num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ) + $past_future * 2; last SWITCH; } |
|
4
|
|
|
|
|
13
|
|
|
4
|
|
|
|
|
14
|
|
3073
|
4
|
|
|
|
|
22
|
$num_days_effective = $past_future * int( abs($date_delta_01 * (7/5) ) ) + $past_future; |
3074
|
|
|
|
|
|
|
} |
3075
|
|
|
|
|
|
|
} |
3076
|
|
|
|
|
|
|
} |
3077
|
|
|
|
|
|
|
else |
3078
|
|
|
|
|
|
|
{ |
3079
|
5
|
|
|
|
|
15
|
$num_days_effective = 0; |
3080
|
|
|
|
|
|
|
} |
3081
|
|
|
|
|
|
|
|
3082
|
|
|
|
|
|
|
|
3083
|
|
|
|
|
|
|
# Check that offset date is a WEEKDAY |
3084
|
76
|
|
|
|
|
301
|
my $weekday_offset_00 = date_offset_in_days($date_in_05, $num_days_effective); |
3085
|
76
|
|
|
|
|
241
|
my $day_of_week_17 = get_numeric_day_of_week($weekday_offset_00); |
3086
|
|
|
|
|
|
|
|
3087
|
76
|
50
|
|
|
|
320
|
( $day_of_week_17 < 6 ) or croak "\n\n ($0) '${\(caller(0))[3]}' Expects the offset date, '$weekday_offset_00', to be a WEEKDAY. It is incorrectly a ${\(set_day_to_day_name_full($day_of_week_17))}. This condition should NOT occur. Something is amiss.\n\n\n"; |
|
0
|
|
|
|
|
0
|
|
|
0
|
|
|
|
|
0
|
|
3088
|
|
|
|
|
|
|
|
3089
|
76
|
|
|
|
|
962
|
return ( $weekday_offset_00 ); |
3090
|
|
|
|
|
|
|
} |
3091
|
|
|
|
|
|
|
|
3092
|
|
|
|
|
|
|
|
3093
|
|
|
|
|
|
|
|
3094
|
|
|
|
|
|
|
|
3095
|
|
|
|
|
|
|
} |
3096
|
|
|
|
|
|
|
1; |
3097
|
|
|
|
|
|
|
|
3098
|
|
|
|
|
|
|
__END__ |