###############################################################################
## Copyright (c) 2000 - 2002 by Steffen Beyer. ##
## All rights reserved. ##
## This package is free software; you can redistribute it ##
## and/or modify it under the same terms as Perl itself. ##
###############################################################################
###############################################################################
## Mottos of this module: ##
## 1) Small is beautiful. ##
## 2) Make frequent things easy and infrequent or hard things possible. ##
###############################################################################
package Date
::Calc
::Object
;
use vars
qw(@ISA @AUXILIARY @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
use Carp::Clan qw(^Date::);
BEGIN # Re-export imports from Date::Calc:
@ISA = qw(Exporter Date::Calc);
@AUXILIARY = qw(shift_year shift_date shift_time shift_datetime);
@EXPORT = @Date::Calc
::EXPORT
;
@EXPORT_OK = (@Date::Calc
::EXPORT_OK
,@AUXILIARY);
%EXPORT_TAGS = (all
=> [@Date::Calc
::EXPORT_OK
],
Date
::Calc
->import(@Date::Calc
::EXPORT
,@Date::Calc
::EXPORT_OK
);
croak
("internal error - parameter is not an ARRAY ref") if (ref($_[0]) ne 'ARRAY');
if (ref($_[0][0]) eq 'ARRAY')
if (@
{$_[0][0]} == 3) # otherwise anonymous array is pointless
return ${shift(@
{$_[0]})}[0];
croak
("wrong number of elements in date constant");
elsif (ref($_[0][0]) =~ /[^:]::[^:]/)
return shift(@
{$_[0]})->year();
croak
("input parameter is neither ARRAY ref nor object");
croak
("not enough input parameters for a year");
croak
("internal error - parameter is not an ARRAY ref") if (ref($_[0]) ne 'ARRAY');
if (ref($_[0][0]) eq 'ARRAY')
return( @
{shift(@
{$_[0]})} );
croak
("wrong number of elements in date constant");
elsif (ref($_[0][0]) =~ /[^:]::[^:]/)
return( shift(@
{$_[0]})->date() );
croak
("input parameter is neither ARRAY ref nor object");
return( shift(@
{$_[0]}), shift(@
{$_[0]}), shift(@
{$_[0]}) );
croak
("not enough input parameters for a date");
croak
("internal error - parameter is not an ARRAY ref") if (ref($_[0]) ne 'ARRAY');
if (ref($_[0][0]) eq 'ARRAY')
return( @
{shift(@
{$_[0]})} );
croak
("wrong number of elements in time constant");
elsif (ref($_[0][0]) =~ /[^:]::[^:]/)
return( (shift(@
{$_[0]})->datetime())[3,4,5] );
croak
("input parameter is neither ARRAY ref nor object");
return( shift(@
{$_[0]}), shift(@
{$_[0]}), shift(@
{$_[0]}) );
croak
("not enough input parameters for time values");
croak
("internal error - parameter is not an ARRAY ref") if (ref($_[0]) ne 'ARRAY');
if (ref($_[0][0]) eq 'ARRAY')
return( @
{shift(@
{$_[0]})} );
croak
("wrong number of elements in date-time constant");
elsif (ref($_[0][0]) =~ /[^:]::[^:]/)
return( shift(@
{$_[0]})->datetime() );
croak
("input parameter is neither ARRAY ref nor object");
return( shift(@
{$_[0]}), shift(@
{$_[0]}), shift(@
{$_[0]}),
shift(@
{$_[0]}), shift(@
{$_[0]}), shift(@
{$_[0]}) );
croak
("not enough input parameters for a date and time");
use Carp
::Clan
qw(^Date::);
'neg' => '_unary_minus_',
'<=>' => '_compare_date_',
'cmp' => '_compare_date_time_',
'!=' => '_not_equal_date_',
'eq' => '_equal_date_time_',
'ne' => '_not_equal_date_time_',
'nomethod' => 'OVERLOAD', # equivalent of AUTOLOAD ;-)
# Report unimplemented overloaded operators:
croak
("operator '$_[3]' is unimplemented");
# Prevent nearly infinite loops:
my($flag) = $ACCURATE_MODE;
$ACCURATE_MODE = $_[1] || 0;
my($flag) = $NUMBER_FORMAT;
$NUMBER_FORMAT = $_[1] || 0;
if (ref $self) # object method
$flag = defined($self->[0][1]) ?
$self->[0][1] : undef;
$self->[0][1] = defined($_[0]) ?
$_[0] : undef;
$DELTA_FORMAT = $_[0] || 0;
if (ref $self) # object method
$flag = defined($self->[0][2]) ?
$self->[0][2] : undef;
$self->[0][2] = defined($_[0]) ?
$_[0] : undef;
$DATE_FORMAT = $_[0] || 0;
if (ref $self) # object method
$lang = defined($self->[0][3]) ? Language_to_Text
($self->[0][3]) : undef;
{ $temp = Decode_Language
($temp); }
if ($temp > 0 and $temp <= Languages
())
{ $self->[0][3] = $temp; }
{ die "no such language '$_[0]'"; }
else { $self->[0][3] = undef; }
$lang = Language_to_Text
(Language
());
{ $temp = Decode_Language
($temp); }
if ($temp > 0 and $temp <= Languages
())
{ die "no such language '$_[0]'"; }
$@
=~ s!^.*[A-Za-z0-9_]+(?:::[A-Za-z0-9_]+)*\(\):\s*!!;
$@
=~ s!\s+at\s+\S.*\s*$!!;
if (defined($self->[0]) and
ref($self->[0]) eq 'ARRAY' and
{ $bool = ($self->[0][0] ?
1 : 0); }
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
if (defined($self->[0]) and
ref($self->[0]) eq 'ARRAY' and
{ $bool = ($self->[0][0] ?
0 : 1); }
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
if (@
{$self} == 4) { $bool = 1; }
elsif (@
{$self} == 7) { $bool = 0; }
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
if (@
{$self} == 7) { $bool = 1; }
elsif (@
{$self} == 4) { $bool = 0; }
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
if (defined($self->[0]) and
ref($self->[0]) eq 'ARRAY' and
defined($self->[0][0]) and
not ref($self->[0][0]) and
($self->[0][0] == 0 or $self->[0][0] == 1) and
(@
{$self} == 4 or @
{$self} == 7))
if ($self->[0][0]) # is_delta
defined($self->[1]) and not ref($self->[1]) and
defined($self->[2]) and not ref($self->[2]) and
defined($self->[3]) and not ref($self->[3])
if (@
{$self} > 4) # is_long
defined($self->[4]) and not ref($self->[4]) and
defined($self->[5]) and not ref($self->[5]) and
defined($self->[6]) and not ref($self->[6])
defined($self->[1]) and not ref($self->[1]) and
defined($self->[2]) and not ref($self->[2]) and
defined($self->[3]) and not ref($self->[3]) and
check_date
(@
{$self}[1..3])
if (@
{$self} > 4) # is_long
defined($self->[4]) and not ref($self->[4]) and
defined($self->[5]) and not ref($self->[5]) and
defined($self->[6]) and not ref($self->[6]) and
check_time
(@
{$self}[4..6])
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
splice( @
{$self}, 3, 4, Normalize_DHMS
(@
{$self}[3..6]) );
unless ($ACCURATE_MODE) # YMD_MODE
if ($self->[2] and ($quot = int($self->[2] / 12)))
$self->[2] -= $quot * 12;
carp
("normalizing a date is a no-op") if ($^W
);
my($class,$list,$type,$self);
if (@_ == 1 and ref($_[0]) eq 'ARRAY') { $list = $_[0]; } else { $list = \
@_; }
croak
("wrong number of arguments")
unless (defined($list) and
(@
$list == 0 or @
$list == 1 or @
$list == 3 or @
$list == 4 or @
$list == 6 or @
$list == 7));
if (@
$list == 1 or @
$list == 4 or @
$list == 7)
$type = (shift(@
$list) ?
1 : 0);
$self = [ [$type], @
$list ];
elsif (@
$list == 3 or @
$list == 6)
bless($self, ref($class) || $class || 'Date::Calc');
croak
("invalid date/time") unless ($self->is_valid());
@
{$this->[0]} = @
{$self->[0]};
if (@_ == 1 and ref($_[0])) { $this = $_[0]; } else { $this = \
@_; }
if (ref($this->[0]) eq 'ARRAY') { @
{$self->[0]} = @
{$this->[0]}; }
else { $self->[0][0] = $this->[0]; }
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
croak
("invalid date/time") unless ($self->is_valid());
if (@_ == 1 and ref($_[0]) eq 'ARRAY') { $list = $_[0]; } else { $list = \
@_; }
croak
("wrong number of arguments")
unless (defined($list) and
(@
$list == 0 or @
$list == 1 or @
$list == 3 or @
$list == 4 or @
$list == 6 or @
$list == 7));
if (@
$list == 1 or @
$list == 4 or @
$list == 7)
$self->[0][0] = (shift(@
$list) ?
1 : 0);
if (@
$list == 3 or @
$list == 6)
splice( @
{$self}, 1, scalar(@
$list), @
$list );
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
croak
("invalid date/time") unless ($self->is_valid());
if (@_ == 1 and ref($_[0]) eq 'ARRAY') { $list = $_[0]; } else { $list = \
@_; }
croak
("wrong number of arguments")
unless (defined($list) and
(@
$list == 0 or @
$list == 1 or @
$list == 3 or @
$list == 4));
if (@
$list == 1 or @
$list == 4)
$self->[0][0] = (shift(@
$list) ?
1 : 0);
splice( @
{$self}, 4, 3, @
$list );
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
croak
("invalid date/time") unless ($self->is_valid());
if (@
{$self} == 7) { return (@
{$self}[4..6]); }
if (@_ == 1 and ref($_[0]) eq 'ARRAY') { $list = $_[0]; } else { $list = \
@_; }
croak
("wrong number of arguments")
unless (defined($list) and
(@
$list == 0 or @
$list == 1 or @
$list == 3 or @
$list == 4 or @
$list == 6 or @
$list == 7));
if (@
$list == 1 or @
$list == 4 or @
$list == 7)
$self->[0][0] = (shift(@
$list) ?
1 : 0);
splice( @
{$self}, 1, 6, @
$list, 0,0,0 );
splice( @
{$self}, 1, 6, @
$list );
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
croak
("invalid date/time") unless ($self->is_valid());
if (@
{$self} == 7) { return (@
{$self}[1..6]); }
else { return (@
{$self}[1..3],0,0,0); }
if (ref $self) # object method
$self->date( 0, Today
($gmt) );
return $self->new( 0, Today
($gmt) );
if (ref $self) # object method
$self->time( 0, Now
($gmt) );
return $self->new( 0, Today_and_Now
($gmt) );
if (ref $self) # object method
$self->date( 0, Today_and_Now
($gmt) );
return $self->new( 0, Today_and_Now
($gmt) );
@date = (Gmtime
(@_))[0..5];
$@
=~ s!^.*[A-Za-z0-9_]+(?:::[A-Za-z0-9_]+)*\(\):\s*!!;
$@
=~ s!\s+at\s+\S.*\s*$!!;
if (ref $self) # object method
return $self->new( 0, @date );
@date = (Localtime
(@_))[0..5];
$@
=~ s!^.*[A-Za-z0-9_]+(?:::[A-Za-z0-9_]+)*\(\):\s*!!;
$@
=~ s!\s+at\s+\S.*\s*$!!;
if (ref $self) # object method
return $self->new( 0, @date );
if (ref $self) # object method
croak
("invalid date/time") unless ($self->is_valid());
croak
("can't mktime from a delta vector") if ($self->is_delta()); # add [1970,1,1,0,0,0] first!
$time = Mktime
( $self->datetime() );
$@
=~ s!^.*[A-Za-z0-9_]+(?:::[A-Za-z0-9_]+)*\(\):\s*!!;
$@
=~ s!\s+at\s+\S.*\s*$!!;
@diff = (Timezone
(@_))[0..5];
$@
=~ s!^.*[A-Za-z0-9_]+(?:::[A-Za-z0-9_]+)*\(\):\s*!!;
$@
=~ s!\s+at\s+\S.*\s*$!!;
if (ref $self) # object method
return $self->new( 1, @diff );
if (ref $self) # object method
croak
("invalid date/time") unless ($self->is_valid());
croak
("can't make time from a delta vector") if ($self->is_delta()); # add [1970,1,1,0,0,0] first!
$time = Date_to_Time
( $self->datetime() );
$@
=~ s!^.*[A-Za-z0-9_]+(?:::[A-Za-z0-9_]+)*\(\):\s*!!;
$@
=~ s!\s+at\s+\S.*\s*$!!;
@date = Time_to_Date
(@_);
$@
=~ s!^.*[A-Za-z0-9_]+(?:::[A-Za-z0-9_]+)*\(\):\s*!!;
$@
=~ s!\s+at\s+\S.*\s*$!!;
if (ref $self) # object method
return $self->new( 0, @date );
eval { $self->[1] = $_[0] || 0; };
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
croak
("invalid date/time") unless ($self->is_valid());
eval { $self->[2] = $_[0] || 0; };
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
croak
("invalid date/time") unless ($self->is_valid());
eval { $self->[3] = $_[0] || 0; };
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
croak
("invalid date/time") unless ($self->is_valid());
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
croak
("invalid date/time") unless ($self->is_valid());
if (@
{$self} == 7) { return $self->[4]; }
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
croak
("invalid date/time") unless ($self->is_valid());
if (@
{$self} == 7) { return $self->[5]; }
if ($@
) { $@
=~ s!\s+at\s+\S.*\s*$!!; croak
($@
); }
croak
("invalid date/time") unless ($self->is_valid());
if (@
{$self} == 7) { return $self->[6]; }
###############################
## callback functions: ##
###############################
###############################
$format = $NUMBER_FORMAT unless (defined $format); # because of overloading!
if ($self->[0][0]) # is_delta
# carp("returning a fictitious number of days for delta vector")
# if ((($self->[1] != 0) or ($self->[2] != 0)) and $^W);
if (@
{$self} == 4) # is_short
if (ref($format) eq 'CODE')
$number = &{$format}( $self, 0x02 ); # = TO_NUMBER | IS_DELTA | IS_SHORT
$number = ($self->[1]*12+$self->[2])*31+$self->[3];
if (ref($format) eq 'CODE')
$number = &{$format}( $self, 0x03 ); # = TO_NUMBER | IS_DELTA | IS_LONG
$number = ($self->[1]*12+$self->[2])*31+$self->[3] +
((($self->[4]*60+$self->[5])*60+$self->[6])/86400);
$temp[0] += ($self->[1] * 12 + $self->[2]) * 31;
@temp = map( $_ < 0 ?
$sign = -$_ : $_, Normalize_DHMS
(@temp) );
$number = sprintf( "%s%d.%02d%02d%02d", $sign ?
'-' : '', @temp );
if (@
{$self} == 4) # is_short
if (ref($format) eq 'CODE')
$number = &{$format}( $self, 0x00 ); # = TO_NUMBER | IS_DATE | IS_SHORT
elsif ($format == 2 or $format == 1)
$number = Date_to_Days
( @
{$self}[1..3] );
$number = sprintf( "%04d%02d%02d",
if (ref($format) eq 'CODE')
$number = &{$format}( $self, 0x01 ); # = TO_NUMBER | IS_DATE | IS_LONG
$number = Date_to_Days
( @
{$self}[1..3] ) +
((($self->[4]*60+$self->[5])*60+$self->[6])/86400);
$number = Date_to_Days
( @
{$self}[1..3] ) .
sprintf( ".%02d%02d%02d", @
{$self}[4..6] );
$number = sprintf( "%04d%02d%02d.%02d%02d%02d",
$@
=~ s!^.*[A-Za-z0-9_]+(?:::[A-Za-z0-9_]+)*\(\):\s*!!;
$@
=~ s!\s+at\s+\S.*\s*$!!;
my($self,$format,$language) = @_;
if (defined($language) and $language ne '') # because of overloading!
if ($language =~ /^\d+$/) { $restore = Language
($language); }
else { $restore = Language
(Decode_Language
($language)); }
if (defined $self->[0][3]) { $restore = Language
($self->[0][3]); }
else { $restore = undef; }
$@
=~ s!^.*[A-Za-z0-9_]+(?:::[A-Za-z0-9_]+)*\(\):\s*!!;
$@
=~ s!\s+at\s+\S.*\s*$!!;
if ($self->[0][0]) # is_delta
$format = defined($self->[0][1]) ?
$self->[0][1] : $DELTA_FORMAT
unless (defined $format); # because of overloading!
if (@
{$self} == 4) # is_short
if (ref($format) eq 'CODE')
$string = &{$format}( $self, 0x06 ); # = TO_STRING | IS_DELTA | IS_SHORT
$string = sprintf( "%+d Y %+d M %+d D",
$string = sprintf( "%+dY %+dM %+dD",
$string = sprintf( "%+d %+d %+d",
$string = sprintf( "%+d%+d%+d",
if (ref($format) eq 'CODE')
$string = &{$format}( $self, 0x07 ); # = TO_STRING | IS_DELTA | IS_LONG
$string = sprintf( "%+d Y %+d M %+d D %+d h %+d m %+d s",
$string = sprintf( "%+dY %+dM %+dD %+dh %+dm %+ds",
$string = sprintf( "%+d %+d %+d %+d %+d %+d",
$string = sprintf( "%+d%+d%+d%+d%+d%+d",
$format = defined($self->[0][2]) ?
$self->[0][2] : $DATE_FORMAT
unless (defined $format); # because of overloading!
if (@
{$self} == 4) # is_short
if (ref($format) eq 'CODE')
$string = &{$format}( $self, 0x04 ); # = TO_STRING | IS_DATE | IS_SHORT
$string = Date_to_Text_Long
( @
{$self}[1..3] );
$string = Date_to_Text
( @
{$self}[1..3] );
$string = sprintf( "%02d-%.3s-%04d",
Month_to_Text
($self->[2]),
$string = sprintf( "%04d%02d%02d",
if (ref($format) eq 'CODE')
$string = &{$format}( $self, 0x05 ); # = TO_STRING | IS_DATE | IS_LONG
$string = Date_to_Text_Long
( @
{$self}[1..3] ) .
sprintf( " %02d:%02d:%02d", @
{$self}[4..6] );
$string = Date_to_Text
( @
{$self}[1..3] ) .
sprintf( " %02d:%02d:%02d", @
{$self}[4..6] );
$string = sprintf( "%02d-%.3s-%04d %02d:%02d:%02d",
Month_to_Text
($self->[2]),
$string = sprintf( "%04d%02d%02d%02d%02d%02d",
Language
($restore) if (defined $restore);
$@
=~ s!^.*[A-Za-z0-9_]+(?:::[A-Za-z0-9_]+)*\(\):\s*!!;
$@
=~ s!\s+at\s+\S.*\s*$!!;
my($self,$this,$flag,$code) = @_;
my($result,$val1,$val2,$len1,$len2,$last,$item);
croak
("invalid date/time") unless ($self->is_valid());
croak
("can't apply unary minus to a date")
unless ($self->is_delta());
$result->[0][0] = $self->[0][0];
for ( $item = 1; $item < @
{$self}; $item++ )
$result->[$item] = -$self->[$item];
if (defined $this and ref($this) =~ /[^:]::[^:]/)
croak
("invalid date/time") unless ($this->is_valid());
elsif (defined $this and ref($this) eq 'ARRAY')
if (@
{$this} == 3 or @
{$this} == 6)
$this = $self->new(0,@
{$this});
$this = $self->new($self->is_date(),@
{$this});
$this = $self->new($self->is_delta(),@
{$this});
$this = $self->new(@
{$this});
croak
("invalid date/time") unless ($this->is_valid());
elsif (defined $this and not ref($this))
$this = $self->new(1,0,0,$this || 0);
croak
("invalid date/time") unless ($this->is_valid());
else { croak
("illegal operand type"); }
$val1 = $self->is_date();
$val2 = $this->is_date();
if ($code == 6 or $code == 5)
croak
("can't subtract a date from a delta vector")
if ((not $val1 and $val2 and not $flag) or
($val1 and not $val2 and $flag));
croak
("can't add two dates")
$len1 = $self->is_long();
$len2 = $this->is_long();
if ($len1 or $len2) { $last = 7; }
if (defined $flag) { $result = $self->new((0) x
$last); }
else { $result = $self; }
if (not $val1 and not $val2)
for ( $item = 1; $item < $last; $item++ )
return ($result,$this,$val1,$val2,$len1,$len2);
elsif ($code <= 4 and $code >= 1)
croak
("can't compare a date and a delta vector")
if ($code == 4) { $last = 7; }
for ( $item = 1; $item < $last; $item++ )
if (($self->[$item] || 0) !=
{ $result = 0; last ITEM
; }
# croak("can't compare two delta vectors")
# if (not $val1 and not $val2);
$len1 = int($self->number());
$len2 = int($this->number());
if ($flag) { return $len2 <=> $len1; }
else { return $len1 <=> $len2; }
else { croak
("unexpected internal error; please contact author"); }
my($self,$this,$flag) = @_;
return $self->_process_($this,$flag,0);
my($self,$this,$flag) = @_;
return $self->_process_($this,$flag,1);
my($self,$this,$flag) = @_;
return $self->_process_($this,$flag,2);
my($self,$this,$flag) = @_;
return $self->_process_($this,$flag,3);
my($self,$this,$flag) = @_;
return $self->_process_($this,$flag,3) ^ 1;
my($self,$this,$flag) = @_;
return $self->_process_($this,$flag,4);
sub _not_equal_date_time_
my($self,$this,$flag) = @_;
return $self->_process_($this,$flag,4) ^ 1;
if (@
{$self} == 7) { return (@
{$self}[1..6]); }
else { return (@
{$self}[1..3],0,0,0); }
my($result,$self,$this,$flag,$val1,$val2,$len1,$len2) = @_;
if ($val1) # date + delta => date
splice( @
{$result}, 1, 6,
Add_Delta_YMDHMS
( $self->_date_time_(),
$this->_date_time_() ) );
splice( @
{$result}, 1, 3,
Add_Delta_YMD
( @
{$self}[1..3], @
{$this}[1..3] ) );
else # delta + date => date
splice( @
{$result}, 1, 6,
Add_Delta_YMDHMS
( $this->_date_time_(),
$self->_date_time_() ) );
splice( @
{$result}, 1, 3,
Add_Delta_YMD
( @
{$this}[1..3], @
{$self}[1..3] ) );
carp
("implicitly changed object type from delta vector to date")
if (not defined $flag and $^W
);
my($self,$this,$flag) = @_;
my($result,$val1,$val2,$len1,$len2);
($result,$this,$val1,$val2,$len1,$len2) = $self->_process_($this,$flag,5);
$result->_add_($self,$this,$flag,$val1,$val2,$len1,$len2);
my($self,$this,$flag) = @_;
my($result,$val1,$val2,$len1,$len2,$temp,$item);
($result,$this,$val1,$val2,$len1,$len2) = $self->_process_($this,$flag,6);
if ($val1 and $val2) # date - date => delta
splice( @
{$result}, 1, 6, 0, 0,
Delta_DHMS
( $self->_date_time_(),
$this->_date_time_() ) );
splice( @
{$result}, 1, 6, 0, 0,
Delta_DHMS
( $this->_date_time_(),
$self->_date_time_() ) );
splice( @
{$result}, 1, 6,
Delta_YMDHMS
( $self->_date_time_(),
$this->_date_time_() ) );
splice( @
{$result}, 1, 6,
Delta_YMDHMS
( $this->_date_time_(),
$self->_date_time_() ) );
splice( @
{$result}, 1, 3, 0, 0,
Delta_Days
( @
{$self}[1..3], @
{$this}[1..3] ) );
splice( @
{$result}, 1, 3, 0, 0,
Delta_Days
( @
{$this}[1..3], @
{$self}[1..3] ) );
splice( @
{$result}, 1, 3,
Delta_YMD
( @
{$self}[1..3], @
{$this}[1..3] ) );
splice( @
{$result}, 1, 3,
Delta_YMD
( @
{$this}[1..3], @
{$self}[1..3] ) );
carp
("implicitly changed object type from date to delta vector")
if (not defined $flag and $^W
);
else # date - delta => date
$temp->[0][0] = $this->[0][0];
for ( $item = 1; $item < @
{$this}; $item++ )
$temp->[$item] = -$this->[$item];
$result->_add_($self,$temp,$flag,$val1,$val2,$len1,$len2);
$temp->[0][0] = $self->[0][0];
for ( $item = 1; $item < @
{$self}; $item++ )
$temp->[$item] = -$self->[$item];
$result->_add_($temp,$this,$flag,$val1,$val2,$len1,$len2);
return $self->_plus_($this,undef);
return $self->_minus_($this,undef);
return $self->_plus_(1,undef);
return $self->_minus_(1,undef);