Date-Holidays-US
view release on metacpan or search on metacpan
lib/Date/Holidays/US.pm view on Meta::CPAN
Returns a holiday name or undef given three arguments (year, month, day).
my ($year, $month, $day) = (2022, 6, 19);
use Date::Holidays::US qw{is_holiday};
my $holiday_name = is_holiday($year, $month, $day);
if (defined $holiday_name) {
print "Holiday: $holiday_name\n";
} else {
print "Not a US Holiday\n";
}
=cut
sub is_holiday {
my $year = shift;
my $month = shift;
my $day = shift;
my $wday = POSIX::strftime(qq{%w}, 0, 0, 0, $day, $month-1, $year-1900); #12:00 am (0-6 starting on Sunday)
#Ref: https://sgp.fas.org/crs/misc/R41990.pdf - Federal Holidays: Evolution and Current Practices (July 1, 2021)
#5 U.S. Code § 6103 - Holidays
#The history of federal holidays in the United States dates back to June 28, 1870
if ($year > 1870 and $month == 1 and $day == 1) {
return q{New Year's Day}; #January 1
} elsif ($year > 1909 and $month == 1 and $day == 2 and $wday == 1) { #Executive Order 1076 (May 22, 1909)
return q{New Year's Day Observed}; #Monday after January 1
#observed for the first time on January 20, 1986. - Pub.L. 98â399, 98 Stat. 1475, enacted November 2, 1983
} elsif ($year >= 1986 and $month == 1 and $day >= 15 and $day <= 21 and $wday == 1) {
return 'Birthday of Martin Luther King, Jr.' #the third Monday in January
#Inauguration Day - Only DC Area
#Purposefully processed after MLK day. In the case of concurrency, MLK is returned.
} elsif ($year >= 1965 and $month == 1 and $day == 20 and $year % 4 == 1 and $wday != 0) { #5 U.S. Code 6103(c)
return 'Inauguration Day' #January 20 of each fourth year after 1965 unless Sunday
#Note 5 U.S. Code 6103(c) provides for Monday Jan 21 to be Inauguration Day but this package returns MKL day after 1985
} elsif ($year == 1985 and $month == 1 and $day == 21) { #5 U.S. Code 6103(c)
return 'Inauguration Day' #When January 20 ... falls on Sunday, the next succeeding day...
# Washington's Birthday was celebrated on February 22 from 1879 until 1970.
# in 1968 the Uniform Monday Holiday Act moved it to the third Monday in February
# The Act was signed into law on June 1, 1968, and took effect on January 1, 1971.
} elsif ($year >= 1879 and $year < 1971 and $month == 2 and $day == 22) {
return q{Washington's Birthday}; #February 22 from 1879 until 1970
} elsif ($year > 1909 and $year < 1971 and $month == 2 and $day == 23 and $wday == 1) { #Executive Order 1076 (May 22, 1909)
return q{Washington's Birthday Observed}; #February 23 when Monday
} elsif ($year >= 1971 and $month == 2 and $day >= 15 and $day <= 21 and $wday == 1) { #Uniform Monday Holiday Act (June 28, 1968)
return q{Washington's Birthday}; #the third Monday in February
# Memorial Day/Decoration Day
} elsif ($year >= 1888 and $year < 1971 and $month == 5 and $day == 30) {
return 'Decoration Day'; #May 30
} elsif ($year >= 1909 and $year < 1971 and $month == 6 and $day == 1 and $wday == 1) { #Executive Order 1076 (May 22, 1909)
return 'Decoration Day Observed'; #June 1st
} elsif ($year >= 1971 and $month == 5 and $day >= 25 and $day <= 31 and $wday == 1) { #Uniform Monday Holiday Act (June 28, 1968)
return 'Memorial Day'; #the last Monday in May
#The day was first recognized as a federal holiday in June 2021, when President
#Joe Biden signed the Juneteenth National Independence Day Act into law.
} elsif ($year >= 2021 and $month == 6 and $day == 18 and $wday == 5) { #Executive Order 11582 (Feb. 11, 1971) "or any other calendar day designated as a holiday by Federal statute"
return 'Juneteenth National Independence Day Observed'; #Friday before June 19
} elsif ($year >= 2021 and $month == 6 and $day == 19) { #Juneteenth National Independence Day Act (June 17, 2021)
return 'Juneteenth National Independence Day'; #June 19
} elsif ($year >= 2021 and $month == 6 and $day == 20 and $wday == 1) { #Executive Order 11582 (Feb. 11, 1971)
return 'Juneteenth National Independence Day Observed'; #Monday after June 19
#Independence Day
} elsif ($year >= 1971 and $month == 7 and $day == 3 and $wday == 5) { #Executive Order 11582 (Feb. 11, 1971)
return 'Independence Day Observed'; #Friday before July 4
} elsif ($year >= 1870 and $month == 7 and $day == 4) {
return 'Independence Day'; #July 4
} elsif ($year >= 1909 and $month == 7 and $day == 5 and $wday == 1) { #Executive Order 1076 (May 22, 1909)
return 'Independence Day Observed'; #Monday after July 4
## Labor Day
# By 1894, thirty U.S. states were already officially celebrating Labor Day. In that year,
# Congress passed a bill recognizing the first Monday of September as Labor Day and making
# it an official federal holiday. President Grover Cleveland signed the bill into law on
# June 28.[15][4] The federal law, however, only made it a holiday for federal workers.
} elsif ($year >= 1894 and $month == 9 and $day >= 1 and $day <= 7 and $wday == 1) {
return 'Labor Day'; #the first Monday in September
##Columbus Day
} elsif ($year >= 1971 and $month == 10 and $day >= 8 and $day <= 14 and $wday == 1) { #Uniform Monday Holiday Act
return 'Columbus Day'; #the second Monday in October
##Veterans Day (>1954)/Armistice Day (<1954)
#November 11 (1938 to 1970 and >1978)
#fourth Monday in October (1971 to 1977)
} elsif ($year >= 1938 and $year < 1954 and $month == 11 and $day == 11) {
return 'Armistice Day'; #November 11
} elsif ($year >= 1945 and $year < 1954 and $month == 11 and $day == 12 and $wday == 1) { #Executive Order 9636 (October 3, 1945)
return 'Armistice Day Observed'; #Monday after November 11
} elsif ($year >= 1954 and $year < 1971 and $month == 11 and $day == 11) {
return 'Veterans Day'; #November 11
} elsif ($year >= 1954 and $year < 1971 and $month == 11 and $day == 12 and $wday == 1) { #Executive Order 9636 (October 3, 1945)
return 'Veterans Day Observed'; #Monday after November 11
} elsif ($year >= 1971 and $year < 1978 and $month == 10 and $day >= 22 and $day <= 28 and $wday == 1) {
return 'Veterans Day'; #fourth Monday in October
} elsif ($year >= 1978 and $month == 11 and $day == 10 and $wday == 5) { #Executive Order 11582 (Feb. 11, 1971)
return 'Veterans Day Observed'; #Friday before November 11
} elsif ($year >= 1978 and $month == 11 and $day == 11) {
return 'Veterans Day'; #November 11
} elsif ($year >= 1978 and $month == 11 and $day == 12 and $wday == 1) { #Executive Order 11582 (Feb. 11, 1971)
return 'Veterans Day Observed'; #Monday after November 11
##Thanksgiving Day
#ref: https://library.law.unc.edu/2024/11/the-history-of-the-thanksgiving-holiday/
} elsif ($year >= 1870 and $year < 1939 and $month == 11 and $day >= 24 and $day <= 30 and $wday == 4) { #Law 1870 but date set by President
return 'Thanksgiving Day'; #the last Thursday in November precedent from Abraham Lincoln
} elsif ($year >= 1939 and $year <= 1941 and $month == 11 and $day >= 17 and $day <= 23 and $wday == 4) { #FDR "Franksgiving"
return 'Thanksgiving Day'; #the second to last Thursday by FDR 1939-1941
} elsif ($year > 1941 and $month == 11 and $day >= 22 and $day <= 28 and $wday == 4) { #Law signed December 26, 1941
return 'Thanksgiving Day'; #the fourth Thursday in November.
( run in 1.092 second using v1.01-cache-2.11-cpan-364913b4093 )