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 )