DateTimeX-Moment
view release on metacpan or search on metacpan
lib/DateTimeX/Moment/Duration.pm view on Meta::CPAN
sub delta_months { shift->{months} }
sub delta_days { shift->{days} }
sub delta_minutes { shift->{minutes} }
sub delta_seconds { shift->{seconds} }
sub delta_nanoseconds { shift->{nanoseconds} }
sub in_units {
my $self = shift;
my @units = @_;
my %units = map { $_ => 1 } @units;
my %ret;
my ($months, $days, $minutes, $seconds) = @$self{qw/months days minutes seconds/};
if ($units{years}) {
$ret{years} = int($months / 12);
$months -= $ret{years} * 12;
}
if ($units{months}) {
$ret{months} = $months;
}
if ($units{weeks}) {
$ret{weeks} = int($days / 7);
$days -= $ret{weeks} * 7;
}
if ($units{days}) {
$ret{days} = $days;
}
if ($units{hours}) {
$ret{hours} = int($minutes / 60);
$minutes -= $ret{hours} * 60;
}
if ($units{minutes}) {
$ret{minutes} = $minutes;
}
if ($units{seconds}) {
$ret{seconds} = $seconds;
$seconds = 0;
}
if ($units{nanoseconds}) {
$ret{nanoseconds} = $seconds * 1_000_000_000 + $self->{nanoseconds};
}
return wantarray ? @ret{@units} : $ret{$units[0]};
}
# XXX: limit mode only
sub is_wrap_mode { 0 }
sub is_limit_mode { 1 }
sub is_preserve_mode { 0 }
sub end_of_month_mode { 'limit' }
sub calendar_duration {
my $self = shift;
my $clone = $self->clone;
$clone->{$_} = 0 for qw/minutes seconds nanoseconds/;
return $clone;
}
sub clock_duration {
my $self = shift;
my $clone = $self->clone;
$clone->{$_} = 0 for qw/months days/;
return $clone;
}
sub inverse {
my $self = shift;
my $clone = $self->clone;
$clone->{$_} *= -1 for keys %$clone;
return $clone;
}
sub add_duration {
my ($lhs, $rhs) = @_;
$lhs->{$_} += $rhs->{$_} for ALL_UNITS;
return $lhs->_normalize_nanoseconds();
}
sub add {
my $self = shift;
my $class = ref $self;
my $lhs = $self;
my $rhs = $class->new(@_);
return $lhs->add_duration($rhs);
}
sub subtract_duration { $_[0]->add_duration($_[1]->inverse) }
sub subtract {
my $self = shift;
my $class = ref $self;
my $lhs = $self;
my $rhs = $class->new(@_);
return $lhs->subtract_duration($rhs);
}
sub multiply {
my ($lhs, $rhs) = @_;
$lhs->{$_} *= $rhs for ALL_UNITS;
return $lhs->_normalize_nanoseconds();
}
sub compare {
my ($class, $lhs, $rhs, $base) = @_;
$base ||= DateTimeX::Moment->now;
return DateTimeX::Moment->compare(
$base->clone->add_duration($lhs),
$base->clone->add_duration($rhs)
);
}
( run in 2.052 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )