DateTime
view release on metacpan or search on metacpan
lib/DateTime/Duration.pm view on Meta::CPAN
package DateTime::Duration;
use strict;
use warnings;
use namespace::autoclean;
our $VERSION = '1.66';
use Carp ();
use DateTime;
use DateTime::Helpers;
use DateTime::Types;
use Params::ValidationCompiler 0.26 qw( validation_for );
use Scalar::Util qw( blessed );
use overload (
fallback => 1,
'+' => '_add_overload',
'-' => '_subtract_overload',
'*' => '_multiply_overload',
'<=>' => '_compare_overload',
'cmp' => '_compare_overload',
);
sub MAX_NANOSECONDS () {1_000_000_000} # 1E9 = almost 32 bits
my @all_units = qw( months days minutes seconds nanoseconds );
{
my %units = map {
$_ => {
# XXX - what we really want is to accept an integer, Inf, -Inf,
# and NaN, but I can't figure out how to accept NaN since it never
# compares to anything.
type => t('Defined'),
default => 0,
}
} qw(
years
months
weeks
days
hours
minutes
seconds
nanoseconds
);
my $check = validation_for(
name => '_check_new_params',
name_is_optional => 1,
params => {
%units,
end_of_month => {
type => t('EndOfMonthMode'),
optional => 1,
},
},
);
sub new {
my $class = shift;
my %p = $check->(@_);
my $self = bless {}, $class;
$self->{months} = ( $p{years} * 12 ) + $p{months};
$self->{days} = ( $p{weeks} * 7 ) + $p{days};
$self->{minutes} = ( $p{hours} * 60 ) + $p{minutes};
$self->{seconds} = $p{seconds};
if ( $p{nanoseconds} ) {
$self->{nanoseconds} = $p{nanoseconds};
$self->_normalize_nanoseconds;
}
else {
# shortcut - if they don't need nanoseconds
$self->{nanoseconds} = 0;
}
$self->{end_of_month} = (
defined $p{end_of_month} ? $p{end_of_month}
: $self->{months} < 0 ? 'preserve'
: 'wrap'
);
return $self;
}
}
( run in 0.960 second using v1.01-cache-2.11-cpan-39bf76dae61 )