Changeset 24234

Show
Ignore:
Timestamp:
11/19/08 13:51:35 (5 years ago)
Author:
daisuke
Message:

04までとりあえず通った

Location:
lang/perl/DateTime-Lite/trunk
Files:
1 added
3 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/DateTime-Lite/trunk/lib/DateTime/Lite.pm

    r24231 r24234  
    33use warnings; 
    44use DateTime::Lite::TimeZone; 
     5use DateTime::Lite::LeapSecond; 
    56use DateTime::Lite::Locale; 
    67use DateTime::Lite::Util; 
    78use Scalar::Util qw(blessed); 
    89use SelfLoader; 
     10use Time::Local qw( timegm_nocheck ); 
    911 
    1012use constant INFINITY     =>      (9 ** 9 ** 9); 
     
    1214use constant NAN          => INFINITY - INFINITY; 
    1315use constant SECONDS_PER_DAY => 86400; 
     16use constant MAX_NANOSECONDS => 1_000_000_000;  # 1E9 = almost 32 bits 
    1417our $DefaultLocale = 'en_US'; 
    1518 
     
    168171        { 
    169172            $self->{offset_modifier} = 
    170                 $self->_day_length( $utc_rd_days - 1 ) - SECONDS_PER_DAY; 
     173                DateTime::Lite::LeapSecond::day_length( $utc_rd_days - 1 ) - SECONDS_PER_DAY; 
    171174 
    172175            $self->{local_rd_secs} += $self->{offset_modifier}; 
     
    181184              ) 
    182185        { 
    183             my $mod = $self->_day_length( $utc_rd_days - 1 ) - SECONDS_PER_DAY; 
     186            my $mod = DateTime::Lite::LeapSecond::day_length( $utc_rd_days - 1 ) - SECONDS_PER_DAY; 
    184187 
    185188            unless ( $mod == 0 ) 
     
    197200        { 
    198201            $self->{offset_modifier} = 
    199                 $self->_day_length( $utc_rd_days - 1 ) - SECONDS_PER_DAY; 
     202                DateTime::Lite::LeapSecond::day_length( $utc_rd_days - 1 ) - SECONDS_PER_DAY; 
    200203            $self->{local_rd_secs} += $self->{offset_modifier}; 
    201204        } 
    202205        elsif ( $second == 60 && $self->{local_rd_secs} == SECONDS_PER_DAY + $offset ) 
    203206        { 
    204             my $mod = $self->_day_length( $utc_rd_days - 1 ) - SECONDS_PER_DAY; 
     207            my $mod = DateTime::Lite::LeapSecond::day_length( $utc_rd_days - 1 ) - SECONDS_PER_DAY; 
    205208 
    206209            unless ( $mod == 0 ) 
     
    371374sub hour_12_0 { $_[0]->hour % 12 } 
    372375 
    373 *min = \&minute; 
    374  
    375 *sec = \&second; 
     376sub min { goto &minute }; 
     377 
     378sub sec { goto &second }; 
    376379 
    377380sub day_name { $_[0]->{locale}->day_format_wide->[ $_[0]->day_of_week_0() ] } 
     
    505508sub formatter { $_[0]->{formatter} } 
    506509 
     510    sub from_epoch 
     511    { 
     512        my ($class, %p) = @_; 
     513 
     514        my %args; 
     515 
     516        # Because epoch may come from Time::HiRes 
     517        my $fraction = $p{epoch} - int( $p{epoch} ); 
     518        $args{nanosecond} = int( $fraction * MAX_NANOSECONDS ) 
     519            if $fraction; 
     520 
     521        # Note, for very large negative values this may give a 
     522        # blatantly wrong answer. 
     523        @args{ qw( second minute hour day month year ) } = 
     524            ( gmtime( int delete $p{epoch} ) )[ 0..5 ]; 
     525        $args{year} += 1900; 
     526        $args{month}++; 
     527 
     528        my $self = $class->new( %p, %args, time_zone => 'UTC' ); 
     529 
     530        $self->set_time_zone( $p{time_zone} ) if exists $p{time_zone}; 
     531 
     532        return $self; 
     533    } 
     534 
     535sub _utc_ymd 
     536{ 
     537    my $self = shift; 
     538 
     539    $self->_calc_utc_components unless exists $self->{utc_c}{year}; 
     540 
     541    return @{ $self->{utc_c} }{ qw( year month day ) }; 
     542} 
     543 
     544sub _utc_hms 
     545{ 
     546    my $self = shift; 
     547 
     548    $self->_calc_utc_components unless exists $self->{utc_c}{hour}; 
     549 
     550    return @{ $self->{utc_c} }{ qw( hour minute second ) }; 
     551} 
     552 
     553# use scalar time in case someone's loaded Time::Piece 
     554sub now { shift->from_epoch( epoch => (scalar CORE::time), @_ ) } 
     555 
     556sub epoch 
     557{ 
     558    my $self = shift; 
     559 
     560    return $self->{utc_c}{epoch} 
     561        if exists $self->{utc_c}{epoch}; 
     562 
     563    my ( $year, $month, $day ) = $self->_utc_ymd; 
     564    my @hms = $self->_utc_hms; 
     565 
     566    $self->{utc_c}{epoch} = 
     567        timegm_nocheck( ( reverse @hms ), 
     568                        $day, 
     569                        $month - 1, 
     570                        $year - 1900, 
     571                      ); 
     572 
     573    return $self->{utc_c}{epoch}; 
     574} 
     575 
     576sub hires_epoch 
     577{ 
     578    my $self = shift; 
     579 
     580    my $epoch = $self->epoch; 
     581 
     582    return undef unless defined $epoch; 
     583 
     584    my $nano = $self->{rd_nanosecs} / MAX_NANOSECONDS; 
     585 
     586    return $epoch + $nano; 
     587} 
     588  
     589 
     590sub _calc_utc_components 
     591{ 
     592    my $self = shift; 
     593 
     594    die "Cannot get UTC components before UTC RD has been calculated\n" 
     595        unless defined $self->{utc_rd_days}; 
     596 
     597    @{ $self->{utc_c} }{ qw( year month day ) } = 
     598        DateTime::Lite::Util::rd2ymd( $self->{utc_rd_days} ); 
     599 
     600    @{ $self->{utc_c} }{ qw( hour minute second ) } = 
     601        DateTime::Lite::Util::seconds_as_components( $self->{utc_rd_secs} ); 
     602} 
     603 
     604 
    507605 
    508606__END__ 
  • lang/perl/DateTime-Lite/trunk/lib/DateTime/Lite/Util.pm

    r24134 r24234  
    44use strict; 
    55use warnings; 
    6 use constant MAX_NANOSECONDS => 1_000_000_000;  # 1E9 = almost 32 bits 
    76 
    87my (@MonthLengths, @LeapYearMonthLengths); 
     
    9897    if ( $_[1] < 0 ) 
    9998    { 
    100         my $overflow = 1 + $_[1] / MAX_NANOSECONDS; 
    101         $_[1] += $overflow * MAX_NANOSECONDS; 
     99        my $overflow = 1 + $_[1] / DateTime::Lite::MAX_NANOSECONDS(); 
     100        $_[1] += $overflow * DateTime::Lite::MAX_NANOSECONDS(); 
    102101        $_[0] -= $overflow; 
    103102    } 
    104     elsif ( $_[1] >= MAX_NANOSECONDS ) 
    105     { 
    106         my $overflow = $_[1] / MAX_NANOSECONDS; 
    107         $_[1] -= $overflow * MAX_NANOSECONDS; 
     103    elsif ( $_[1] >= DateTime::Lite::MAX_NANOSECONDS() ) 
     104    { 
     105        my $overflow = $_[1] / DateTime::Lite::MAX_NANOSECONDS(); 
     106        $_[1] -= $overflow * DateTime::Lite::MAX_NANOSECONDS(); 
    108107        $_[0] += $overflow; 
    109108    } 
  • lang/perl/DateTime-Lite/trunk/t/04epoch.t

    r24134 r24234  
    8484    is( $epochtest->min, 30, "minute" ); 
    8585 
     86    SKIP: { 
     87        skip "arithmetic not implemented", 2; 
    8688    $epochtest->add( hours => 2 ); 
    8789    $expected += 2 * 60 * 60; 
     
    9092    is( $epochtest->epoch, $expected, 
    9193        "epoch method returns correct adjusted value ($expected)"); 
    92  
     94    } 
    9395} 
    9496