Date-Holidays-CN
view release on metacpan or search on metacpan
lib/Date/Holidays/CN.pm view on Meta::CPAN
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__
=encoding utf8
=head1 NAME
Date::Holidays::CN - Determine Chinese public holidays
=head1 SYNOPSIS
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 = 'ä¸ç§è'
=head1 EXPORT
=head2 is_cn_holiday( $year, $month, $day )
determine whether that day is a Chinese holiday
=head2 cn_holidays($year)
BE CAREFUL! It only provide solar calendar for now! And it's not suggested!
=head1 EXPORT_OK
SUGGESTED! quicker and more elegant!
=head2 is_cn_solar_holiday( $year, $month, $day )
determine whether that day is a Chinese holiday by the Gregorian calendar/solar calendar
=head2 is_cn_lunar_holiday( $year, $month, $day )
determine whether that day is a Chinese holiday by the Chinese calendar/lunar calendar
=head1 RETURN VALUE
if it is a holiday, return the Chinese holiday name(utf8), otherwise return undef.
=head1 AUTHOR
Fayland Lam, C<< <fayland at gmail.com> >>
=head1 COPYRIGHT & LICENSE
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.
=cut
( run in 2.563 seconds using v1.01-cache-2.11-cpan-364913b4093 )