Changeset 24234
- Timestamp:
- 11/19/08 13:51:35 (5 years ago)
- Location:
- lang/perl/DateTime-Lite/trunk
- Files:
-
- 1 added
- 3 modified
-
lib/DateTime/Lite.pm (modified) (7 diffs)
-
lib/DateTime/Lite/LeapSecond.pm (added)
-
lib/DateTime/Lite/Util.pm (modified) (2 diffs)
-
t/04epoch.t (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/DateTime-Lite/trunk/lib/DateTime/Lite.pm
r24231 r24234 3 3 use warnings; 4 4 use DateTime::Lite::TimeZone; 5 use DateTime::Lite::LeapSecond; 5 6 use DateTime::Lite::Locale; 6 7 use DateTime::Lite::Util; 7 8 use Scalar::Util qw(blessed); 8 9 use SelfLoader; 10 use Time::Local qw( timegm_nocheck ); 9 11 10 12 use constant INFINITY => (9 ** 9 ** 9); … … 12 14 use constant NAN => INFINITY - INFINITY; 13 15 use constant SECONDS_PER_DAY => 86400; 16 use constant MAX_NANOSECONDS => 1_000_000_000; # 1E9 = almost 32 bits 14 17 our $DefaultLocale = 'en_US'; 15 18 … … 168 171 { 169 172 $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; 171 174 172 175 $self->{local_rd_secs} += $self->{offset_modifier}; … … 181 184 ) 182 185 { 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; 184 187 185 188 unless ( $mod == 0 ) … … 197 200 { 198 201 $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; 200 203 $self->{local_rd_secs} += $self->{offset_modifier}; 201 204 } 202 205 elsif ( $second == 60 && $self->{local_rd_secs} == SECONDS_PER_DAY + $offset ) 203 206 { 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; 205 208 206 209 unless ( $mod == 0 ) … … 371 374 sub hour_12_0 { $_[0]->hour % 12 } 372 375 373 *min = \&minute;374 375 *sec = \&second;376 sub min { goto &minute }; 377 378 sub sec { goto &second }; 376 379 377 380 sub day_name { $_[0]->{locale}->day_format_wide->[ $_[0]->day_of_week_0() ] } … … 505 508 sub formatter { $_[0]->{formatter} } 506 509 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 535 sub _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 544 sub _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 554 sub now { shift->from_epoch( epoch => (scalar CORE::time), @_ ) } 555 556 sub 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 576 sub 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 590 sub _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 507 605 508 606 __END__ -
lang/perl/DateTime-Lite/trunk/lib/DateTime/Lite/Util.pm
r24134 r24234 4 4 use strict; 5 5 use warnings; 6 use constant MAX_NANOSECONDS => 1_000_000_000; # 1E9 = almost 32 bits7 6 8 7 my (@MonthLengths, @LeapYearMonthLengths); … … 98 97 if ( $_[1] < 0 ) 99 98 { 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(); 102 101 $_[0] -= $overflow; 103 102 } 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(); 108 107 $_[0] += $overflow; 109 108 } -
lang/perl/DateTime-Lite/trunk/t/04epoch.t
r24134 r24234 84 84 is( $epochtest->min, 30, "minute" ); 85 85 86 SKIP: { 87 skip "arithmetic not implemented", 2; 86 88 $epochtest->add( hours => 2 ); 87 89 $expected += 2 * 60 * 60; … … 90 92 is( $epochtest->epoch, $expected, 91 93 "epoch method returns correct adjusted value ($expected)"); 92 94 } 93 95 } 94 96
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)