| Date-Holidays-CN documentation | Contained in the Date-Holidays-CN distribution. |
Date::Holidays::CN - Determine Chinese public holidays
use Date::Holidays::CN;
my ($year, $month, $day) = (localtime)[ 5, 4, 3 ];
$year += 1900;
$month += 1;
if (my $holidayname = is_cn_holiday( $year, $month, $day )) {
print "这是个 $holidayname";
}
my $h = cn_holidays($year);
printf "10 月 1 日是 '%s'\n", $h->{'1001'};
# suggested
use Date::Holidays::CN qw/is_cn_solar_holiday is_cn_lunar_holiday/;
my $holidayname = is_cn_solar_holiday( 2005, 10, 1 ); # $day = '国庆节'
my $is_holiday = is_cn_lunar_holiday( 2005, 9, 18 ); # $day = '中秋节'
determine whether that day is a Chinese holiday
BE CAREFUL! It only provide solar calendar for now! And it's not suggested!
SUGGESTED! quicker and more elegant!
determine whether that day is a Chinese holiday by the Gregorian calendar/solar calendar
determine whether that day is a Chinese holiday by the Chinese calendar/lunar calendar
if it is a holiday, return the Chinese holiday name(utf8), otherwise return undef.
Fayland Lam, <fayland at gmail.com>
Copyright 2005 Fayland Lam, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| Date-Holidays-CN documentation | Contained in the Date-Holidays-CN distribution. |
package Date::Holidays::CN; use warnings; use strict; use Carp; use base 'Exporter'; use vars qw/$VERSION @EXPORT @EXPORT_OK/; $VERSION = '0.01'; @EXPORT = qw(is_cn_holiday cn_holidays); @EXPORT_OK = qw(is_cn_solar_holiday is_cn_lunar_holiday); use DateTime; use DateTime::Calendar::Chinese; use Time::Local; # The Gregorian calendar/solar calendar my $SOLAR = { '0101' => 'å æ¦', '0214' => 'æ 人è', '0308' => 'å¦å¥³è', '0312' => 'æ¤æ è', '0401' => 'æäººè', '0405' => 'æ¸ æè', '0501' => 'å³å¨è', '0504' => 'éå¹´è', '0601' => 'å³å¨è', '0701' => 'å»ºå æ¥', '0801' => '建åè', '0910' => 'æå¸è', '1001' => 'å½åºè', '1225' => 'å£è¯è', }; # The Chinese calendar/lunar calendar my $LUNAR = { '0101' => 'æ¥è', '0115' => 'å 宵è', '0505' => '端åè', '0707' => 'ä¸å¤æ 人è', '0815' => 'ä¸ç§è', '0909' => 'éé³è', '1208' => 'è å «è', '1222' => 'å¬è³è', '1230' => 'é¤å¤', }; sub is_cn_solar_holiday { my ($year, $month, $day) = @_; defined $year || return undef; defined $month || return undef; defined $day || return undef; # the special day: mother's day and father's day # mother's day = 2th sunday of 5 if ($month == 5 && ($day > 7 && $day < 15)) { my $time = timelocal(0,0,0, $day, $month - 1, $year); my @ltime = localtime($time); return 'æ¯äº²è' if ($ltime[6] == 0); } # father's day = 3th sunday of 6 if ($month == 6 && ($day > 14 && $day < 22)) { my $time = timelocal(0,1,0, $day, $month - 1, $year); my @ltime = localtime($time); return 'ç¶äº²è' if ($ltime[6] == 0); } return $SOLAR->{sprintf "%02d%02d", $month, $day}; } sub is_cn_lunar_holiday { my ($year, $month, $day) = @_; defined $year || return undef; defined $month || return undef; defined $day || return undef; my $dt2 = DateTime->new( year => $year, month => $month, day => $day, hour => 0, minute => 0, second => 0, nanosecond => 500000000, time_zone => 'Asia/Shanghai', ); # ouch! the DateTime::Calendar::Chinese is a bit too slow! my $dt = DateTime::Calendar::Chinese->from_object(object => $dt2); return $LUNAR->{sprintf "%02d%02d", $dt->month, $dt->day}; } sub is_cn_holiday { is_cn_solar_holiday(@_) || is_cn_lunar_holiday(@_); } sub cn_holidays { my ($year) = @_; defined $year || return undef; # only provide solar calendar for now return $SOLAR; } 1; __END__