| Calendar-Japanese-Holiday documentation | Contained in the Calendar-Japanese-Holiday distribution. |
Calendar::Japanese::Holiday - Japanese holidays in calender
use Calendar::Japanese::Holiday; # Getting a list of holidays $holidays = getHolidays(2008, 5); $holidays = getHolidays(2008, 5, 1); # Examining whether it is holiday or not. $name = isHoliday(2007, 5, 5);
This module treats holidays information in Japanese calendar. The list of holidays can be acquired, and you can examine whether a day is holiday or not. You can acquire the holiday name too.
Returns a hash reference that has holidays in $year/$month. Returns empty hash reference if no holidays. It returns substitute holidays too if $furikae is true. $furikae is false when $furikae is omitted. $year is supported after 1948. A undef is returned if error ocucred.
# Case 1 - $furikae is omitted
$holidays = getHolidays(2008, 5);
Return:
$holidays = {
'4' => "\x{307f}\x{3069}\x{308a}\x{306e}\x{65e5}", # Midori-no-hi
'3' => "\x{61b2}\x{6cd5}\x{8a18}\x{5ff5}\x{65e5}", # Kenpou-Kinenbi
'5' => "\x{3053}\x{3069}\x{3082}\x{306e}\x{65e5}" # Kodomo-no-hi
};
# Case 2 - $furikae is true
$holidays = getHolidays(2008, 5, 1);
Return:
$holidays = {
'6' => "\x{632f}\x{66ff}", # Furikae
'4' => "\x{307f}\x{3069}\x{308a}\x{306e}\x{65e5}", # Midori-no-hi
'3' => "\x{61b2}\x{6cd5}\x{8a18}\x{5ff5}\x{65e5}", # Kenpou-Kinenbi
'5' => "\x{3053}\x{3069}\x{3082}\x{306e}\x{65e5}" # Kodomo-no-hi
};
# Case 3 - no holidays
$holidays = getHolidays(2008, 6);
Return:
$holidays = {};
Returns holiday name. Returns undef if $year/$month/$day is not holiday. $furikae is same as getHolidays().
$name = isHoliday(2007, 5, 5);
$name is "\x{3053}\x{3069}\x{3082}\x{306e}\x{65e5}" Kodomo-no-hi
http://wiki.bit-hive.com/tomizoo/pg/Perl%20%BD%CB%C6%FC%CC%BE%A4%CE%BC%E8%C6%C0
(In Japanese document)
Kazuyoshi Tomita, <kztomita@bit-hive.com>
Copyright (C) 2007 by Kazuyoshi Tomita
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.1 or, at your option, any later version of Perl 5 you may have available.
| Calendar-Japanese-Holiday documentation | Contained in the Calendar-Japanese-Holiday distribution. |
package Calendar::Japanese::Holiday; use 5.008001; use strict; use warnings; use utf8; use Time::Local; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(getHolidays isHoliday); our $VERSION = '0.03'; our $FurikaeStr = 'æ¯æ¿'; my @StaticHoliday = ( # 4/29 ã¿ã©ãã®æ¥ => æåã®æ¥ 夿´ # ã¿ã©ãã®æ¥ã¯5/4ã«ç§»è¡ {'start' => 2007, 'end' => 2999, 'days' => {1 => { 1 => 'å æ¥'}, 2 => {11 => '建å½è¨å¿µã®æ¥'}, 4 => {29 => 'æåã®æ¥'}, 5 => { 3 => 'æ²æ³è¨å¿µæ¥', 4 => 'ã¿ã©ãã®æ¥', 5 => 'ãã©ãã®æ¥'}, 11 => { 3 => 'æåã®æ¥', 23 => 'å¤å´æè¬ã®æ¥'}, 12 => {23 => '天çèªçæ¥'}, }, }, # æµ·ã®æ¥,æ¬èã®æ¥ãHappy Mondayã« {'start' => 2003, 'end' => 2006, 'days' => {1 => { 1 => 'å æ¥'}, 2 => {11 => '建å½è¨å¿µã®æ¥'}, 4 => {29 => 'ã¿ã©ãã®æ¥'}, 5 => { 3 => 'æ²æ³è¨å¿µæ¥', 5 => 'ãã©ãã®æ¥'}, 11 => { 3 => 'æåã®æ¥', 23 => 'å¤å´æè¬ã®æ¥'}, 12 => {23 => '天çèªçæ¥'}, }, }, # æäººã®æ¥,ä½è²ã®æ¥ãHappy Mondayã« {'start' => 2000, 'end' => 2002, 'days' => {1 => { 1 => 'å æ¥'}, 2 => {11 => '建å½è¨å¿µã®æ¥'}, 4 => {29 => 'ã¿ã©ãã®æ¥'}, 5 => { 3 => 'æ²æ³è¨å¿µæ¥', 5 => 'ãã©ãã®æ¥'}, 7 => {20 => 'æµ·ã®æ¥'}, 9 => {15 => 'æ¬èã®æ¥'}, 11 => { 3 => 'æåã®æ¥', 23 => 'å¤å´æè¬ã®æ¥'}, 12 => {23 => '天çèªçæ¥'}, }, }, # æµ·ã®æ¥è¿½å {'start' => 1996, 'end' => 1999, 'days' => {1 => { 1 => 'å æ¥', 15 => 'æäººã®æ¥'}, 2 => {11 => '建å½è¨å¿µã®æ¥'}, 4 => {29 => 'ã¿ã©ãã®æ¥'}, 5 => { 3 => 'æ²æ³è¨å¿µæ¥', 5 => 'ãã©ãã®æ¥'}, 7 => {20 => 'æµ·ã®æ¥'}, 9 => {15 => 'æ¬èã®æ¥'}, 10 => {10 => 'ä½è²ã®æ¥'}, 11 => { 3 => 'æåã®æ¥', 23 => 'å¤å´æè¬ã®æ¥'}, 12 => {23 => '天çèªçæ¥'}, }, }, # 天çèªçæ¥å¤æ´ 4/29 => 12/23 # æ§å¤©çèªçæ¥ãã¿ã©ãã®æ¥ã«å¤æ´ {'start' => 1989, 'end' => 1995, 'days' => {1 => { 1 => 'å æ¥', 15 => 'æäººã®æ¥'}, 2 => {11 => '建å½è¨å¿µã®æ¥'}, 4 => {29 => 'ã¿ã©ãã®æ¥'}, 5 => { 3 => 'æ²æ³è¨å¿µæ¥', 5 => 'ãã©ãã®æ¥'}, 9 => {15 => 'æ¬èã®æ¥'}, 10 => {10 => 'ä½è²ã®æ¥'}, 11 => { 3 => 'æåã®æ¥', 23 => 'å¤å´æè¬ã®æ¥'}, 12 => {23 => '天çèªçæ¥'}, }, }, # 建å½è¨å¿µã®æ¥è¿½å {'start' => 1967, 'end' => 1988, 'days' => {1 => { 1 => 'å æ¥', 15 => 'æäººã®æ¥'}, 2 => {11 => '建å½è¨å¿µã®æ¥'}, 4 => {29 => '天çèªçæ¥'}, 5 => { 3 => 'æ²æ³è¨å¿µæ¥', 5 => 'ãã©ãã®æ¥'}, 9 => {15 => 'æ¬èã®æ¥'}, 10 => {10 => 'ä½è²ã®æ¥'}, 11 => { 3 => 'æåã®æ¥', 23 => 'å¤å´æè¬ã®æ¥'}, }, }, # æ¬èã®æ¥,ä½è²ã®æ¥è¿½å {'start' => 1966, 'end' => 1966, 'days' => {1 => { 1 => 'å æ¥', 15 => 'æäººã®æ¥'}, 4 => {29 => '天çèªçæ¥'}, 5 => { 3 => 'æ²æ³è¨å¿µæ¥', 5 => 'ãã©ãã®æ¥'}, 9 => {15 => 'æ¬èã®æ¥'}, 10 => {10 => 'ä½è²ã®æ¥'}, 11 => { 3 => 'æåã®æ¥', 23 => 'å¤å´æè¬ã®æ¥'}, }, }, # 彿°ã®ç¥æ¥ã«é¢ããæ³å¾ã«å®ããããç¥æ¥ã®ãã¡7/20以åã®ãã®ã追å {'start' => 1949, 'end' => 1965, 'days' => {1 => { 1 => 'å æ¥', 15 => 'æäººã®æ¥'}, 4 => {29 => '天çèªçæ¥'}, 5 => { 3 => 'æ²æ³è¨å¿µæ¥', 5 => 'ãã©ãã®æ¥'}, 11 => { 3 => 'æåã®æ¥', 23 => 'å¤å´æè¬ã®æ¥'}, }, }, # 彿°ã®ç¥æ¥ã«é¢ããæ³å¾ 1948/7/20å¶å® {'start' => 1948, 'end' => 1948, 'days' => {11 => { 3 => 'æåã®æ¥', 23 => 'å¤å´æè¬ã®æ¥'}, }, }, ); my %ExceptionalHoliday = ( 195904 => {10 => 'ç太åæä»è¦ªçã®çµå©ã®å'}, 198902 => {24 => 'æå天çã®å¤§åªã®ç¤¼'}, 199011 => {12 => 'å³ä½ç¤¼æ£æ®¿ã®å'}, 199306 => { 9 => 'ç太åå¾³ä»è¦ªçã®çµå©ã®å'}, ); my @daysInMonth = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); sub days_in_month { my ($year, $mon) = @_; my $days = $daysInMonth[$mon - 1]; if ($mon == 2 && $year % 4 == 0) { if ($year % 100 == 0) { return $days + 1 if $year % 400 == 0; return $days; } return $days + 1; } return $days; } # æå®ææ¥ã®æ¥ä»ä¸è¦§ãé åã§è¿ã sub weekdays { my ($year, $mon, $wday) = @_; my @week_days; my $wd = (localtime(timelocal(0, 0, 0, 1, $mon - 1, $year)))[6]; # æå®ææ¥ã®æåã®æ¥ä»(ã«ã¬ã³ãã¼çã«ç©ºæ¬ã®å ´åã¯0以ä¸ã®å¤ã¨ãªã) my $start = 1 - $wd + $wday; my $last_day = days_in_month($year, $mon); for (my $day = $start ; $day <= $last_day ; $day += 7) { push @week_days, $day if $day > 0; } return @week_days; } sub lookup_holiday_table { my ($year) = @_; foreach my $tbl (@StaticHoliday) { return $tbl->{days} if ($tbl->{start} <= $year && $year <= $tbl->{end}); } return; } # æ¥åã®æ¥ # Ref to. # http://www.nao.ac.jp/QA/faq/a0301.html # http://ja.wikipedia.org/wiki/%E6%98%A5%E5%88%86%E3%81%AE%E6%97%A5 sub shunbun_day { my ($year) = @_; my $day; my $mod = $year % 4; if ($mod == 0) { if (1900 <= $year && $year <= 1956) {$day = 21;} elsif (1960 <= $year && $year <= 2088) {$day = 20;} elsif (2092 <= $year && $year <= 2096) {$day = 19;} } elsif ($mod == 1) { if (1901 <= $year && $year <= 1989) {$day = 21;} elsif (1993 <= $year && $year <= 2097) {$day = 20;} } elsif ($mod == 2) { if (1902 <= $year && $year <= 2022) {$day = 21;} elsif (2026 <= $year && $year <= 2098) {$day = 20;} } elsif ($mod == 3) { if (1903 <= $year && $year <= 1923) {$day = 22;} elsif (1927 <= $year && $year <= 2055) {$day = 21;} elsif (2059 <= $year && $year <= 2099) {$day = 20;} } return $day; } # ç§åã®æ¥ sub shuubun_day { my ($year) = @_; my $day; my $mod = $year % 4; if ($mod == 0) { if ($year == 1900) {$day = 23;} elsif (1904 <= $year && $year <= 2008) {$day = 23;} elsif (2012 <= $year && $year <= 2096) {$day = 22;} } elsif ($mod == 1) { if (1901 <= $year && $year <= 1917) {$day = 24;} elsif (1921 <= $year && $year <= 2041) {$day = 23;} elsif (2045 <= $year && $year <= 2097) {$day = 22;} } elsif ($mod == 2) { if (1902 <= $year && $year <= 1946) {$day = 24;} elsif (1950 <= $year && $year <= 2074) {$day = 23;} elsif (2078 <= $year && $year <= 2098) {$day = 22;} } elsif ($mod == 3) { if (1903 <= $year && $year <= 1979) {$day = 24;} elsif (1983 <= $year && $year <= 2099) {$day = 23;} } return $day; } sub furikae_days { my ($year, $mon, $holidays_tbl) = @_; my %days; return \%days if $year < 1973; while (my ($h_day, $name) = each %$holidays_tbl) { # ç¥æ¥ãæ¥ææ¥ããã§ã㯠my $wday = (localtime(timelocal(0, 0, 0, $h_day, $mon - 1, $year)))[6]; if ($wday == 0) { my $furikae_day = $h_day + 1; if ($year >= 2007) { # æ¯ãæ¿ããå ãç¥æ¥ãªãããã«é²ãã $furikae_day++ while (exists $holidays_tbl->{$furikae_day}); $days{$furikae_day} = $name; } else { $days{$furikae_day} = $name if (!exists $holidays_tbl->{$furikae_day}); } } } return \%days; } sub getHolidays { my ($year, $mon, $furikae) = @_; my $holiday_tbl; return if !($holiday_tbl = lookup_holiday_table($year)); my %holidays; if (exists $holiday_tbl->{$mon}) { %holidays = %{$holiday_tbl->{$mon}}; # Copy } # Happy Monday (æäººã®æ¥ãæµ·ã®æ¥ãæ¬èã®æ¥ãä½è²ã®æ¥) my @mondays = weekdays($year, $mon, 1); # æææ¥ã®ä¸è¦§ if ($year >= 2000) { if ($mon == 1) {$holidays{$mondays[1]} = 'æäººã®æ¥';} if ($mon == 10){$holidays{$mondays[1]} = 'ä½è²ã®æ¥';} } if ($year >= 2003) { if ($mon == 7) {$holidays{$mondays[2]} = 'æµ·ã®æ¥';} if ($mon == 9) {$holidays{$mondays[2]} = 'æ¬èã®æ¥';} } # ä¸å®ãªãã® if ($mon == 3) {$holidays{shunbun_day($year)} = 'æ¥åã®æ¥';} if ($mon == 9) {$holidays{shuubun_day($year)} = 'ç§åã®æ¥';} # ä¾å¤çãªãã® my $yymm = sprintf("%04d%02d", $year, $mon); if (exists $ExceptionalHoliday{$yymm}) { while (my ($day, $name) = each %{$ExceptionalHoliday{$yymm}}) { $holidays{$day} = $name; } } # 彿°ã®ä¼æ¥ if ($year >= 1986) { # ç¥æ¥ã«æã¾ããå¹³æ¥ãæ¢ã (ç¥æ¥A - å¹³æ¥B - ç¥æ¥C) while (my ($day, $name) = each %holidays) { if ( exists $holidays{$day + 2} && !exists $holidays{$day + 1}) { my $wday = (localtime(timelocal(0, 0, 0, $day, $mon - 1, $year)))[6]; # ç¥æ¥Aã®æã¯å¹³æ¥Bã¯ãã ã®æ¯ãæ¿ã伿¥ next if $wday == 0; # å¹³æ¥Bãæ¥æã®å ´åã彿°ã®ä¼æ¥ã¨ã¯ãªããªã next if $wday == 6; $holidays{$day + 1} = '彿°ã®ä¼æ¥'; } } } # æ¯ãæ¿ã伿¥ãå«ãã if ($furikae) { my $furikae_days = furikae_days($year, $mon, \%holidays); while (my ($val, $name) = each %$furikae_days) { $holidays{$val} = $FurikaeStr; } } return \%holidays; } my $Cache_holidays_Year = 0; my $Cache_holidays_Month = 0; my $Cache_holidays; sub isHoliday { my ($year, $mon, $day, $furikae) = @_; my $holidays; if ($year == $Cache_holidays_Year && $mon == $Cache_holidays_Month) { $holidays = $Cache_holidays; # From Cache } else { $holidays = getHolidays($year, $mon, 1); return if not defined $holidays; # Cache $Cache_holidays = $holidays; $Cache_holidays_Year = $year; $Cache_holidays_Month = $mon; } return if !exists $holidays->{$day}; return if (!$furikae && $holidays->{$day} eq $FurikaeStr); return $holidays->{$day}; } 1; __END__