DateTime-Calendar-Japanese
view release on metacpan or search on metacpan
lib/DateTime/Calendar/Japanese.pm view on Meta::CPAN
# $Id: Japanese.pm 3782 2007-11-01 23:18:42Z lestrrat $
#
# Copyright (c) 2007 Daisuke Maki <daisuke@endeworks.jp>
# All rights reserved.
package DateTime::Calendar::Japanese;
use strict;
use warnings;
use vars qw(@ISA $VERSION);
BEGIN
{
$VERSION = '0.06001';
@ISA = qw(DateTime::Calendar::Chinese);
}
use DateTime;
use DateTime::Util::Calc qw(amod truncate_to_midday);
use DateTime::Calendar::Chinese;
use DateTime::Calendar::Japanese::Era;
use DateTime::Event::Sunrise;
use Params::Validate();
my %NewValidate = (
era_year => {
depends => [ 'era_name' ],
type => Params::Validate::SCALAR(),
optional => 1,
},
era_name => {
depends => [ 'era_year' ],
type => Params::Validate::SCALAR(),
optional => 1,
},
hour => {
type => Params::Validate::SCALAR(),
default => 1,
callbacks => { 'is between 1 and 12' =>
sub { $_[0] >= 1 && $_[0] <= 12 } }
},
hour_quarter => {
type => Params::Validate::SCALAR(),
default => 1,
callbacks => { 'is between 1 and 4' =>
sub { $_[0] >= 1 && $_[0] <= 4 } }
},
cycle => {
default => 1,
},
cycle_year => {
default => 1,
callbacks => {
'is between 1 and 60' => sub { $_[0] >= 1 && $_[0] <= 60 }
}
},
month => {
default => 1,
callbacks => {
'is between 1 and 12' => sub { $_[0] >= 1 && $_[0] <= 12 }
}
},
leap_month => {
default => 0,
type => Params::Validate::BOOLEAN()
},
day => {
default => 1,
type => Params::Validate::SCALAR()
},
locale => { type => Params::Validate::SCALAR() | Params::Validate::OBJECT(), optional => 1 },
language => { type => Params::Validate::SCALAR() | Params::Validate::OBJECT(), optional => 1 },
time_zone => { type => Params::Validate::SCALAR() | Params::Validate::OBJECT(), default => 'Asia/Tokyo' },
);
sub _era2cycle
{
my($era_name, $era_year) = @_;
my $era = DateTime::Calendar::Japanese::Era->lookup_by_id(
id => $era_name
) or Carp::croak("Lookup of era name $era_name failed");
# it's darn hard to calculate the dates from the era years,
# so we first calculate a date that will always fall in the
# middle of the year, and then use the cycle/cycle_year
# from that object.
my $cc_date =
DateTime::Calendar::Chinese->from_object(object => $era->start);
my $ny_in_year =
DateTime::Event::Chinese->new_year_for_gregorian_year(datetime => $era->start);
my $elapsed_years = $cc_date->elapsed_years + $era_year;
if ($ny_in_year >= $cc_date->{gregorian}) {
$elapsed_years--;
}
my $cycle = POSIX::floor( ($elapsed_years - 1) / 60) + 1;
my $cycle_year = amod($elapsed_years, 60);
#print STDERR
# "era2cycle: \n",
# " start: ", $cc_date->{gregorian}->datetime, "\n",
# " start_cycle: ", $cc_date->cycle, "\n",
# " start_cycle_year: ", $cc_date->cycle_year, "\n",
# " era_name: ", $era_name, "\n",
# " era_year: ", $era_year, "\n",
# " cycle: ", $cycle, "\n",
# " cycle_year: ", $cycle_year, "\n";
return ($cycle, $cycle_year);
}
sub new
{
my $class = shift;
my %args = Params::Validate::validate_with(
params => \@_,
( run in 0.895 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )