Re: adding days to date

[email protected] ("jagdish eashwar")
Newsgroups perl.datetime
Message-ID <[email protected]>
Hi Zefram,

Thanks. Things are a lot clearer to me now.

Jagdish

On Nov 30, 2007 7:50 PM, Zefram <[email protected]> wrote:

> jagdish eashwar wrote:
> >I came across some unexpected behaviour in datetime. In the following
> >script, I first define $date1. Then I set $day1 = $date1. Then I add 2
> days
> >to $day1. Why does $date1 also get incremented?
>
> Because a DateTime object doesn't represent a date-and-time per se; it
> implements a variable that is typed to hold a date and time.  Walkthrough:
>
> >my $date1 = DateTime->new(year => 2007,
> >             month => 12,
> >             day => 23);
>
> You create a date/time variable, initialised as holding the date
> 2007-12-23.  You set $date1 to be a reference to that variable.
>
> >my $day1 = $date1;
>
> You copy the reference to the date/time variable from $date1 to $day1.
> Both of these Perl variables now refer to the same date/time variable.
>
> >$day1->add(days => 2);
>
> You reference the date/time variable (via $day1), and tell it to modify
> the date value that it holds by advancing it by two days.  The date/time
> variable now holds the date 2007-12-25.
>
> >print "day1 = ",$day1,"\n";   # gives me 2007-12-25 correctly.
>
> You reference the date/time variable (via $day1), and ask it to display
> the date that it holds (2007-12-25).
>
> >print "date1 = ",$date1,"\n";  # why does $date1 also change to
> 2007-12-25?
>
> You reference the date/time variable (via $date1), and ask it again to
> display the date that it holds (2007-12-25).
>
> The stage that should have rung alarm bells for you is
>
>        $day1->add(days => 2);
>
> where you're doing date arithmetic calling a method on an object and
> *ignoring its return value*.  This method operates by having a side effect
> on the object.  If, instead, DateTime objects actually represented dates
> and times per se, then there wouldn't be any of these side effects,
> and this step in the program (combined with the previous step) would
> instead be something like
>
>        my $day1 = $date1->plus(days => 2);
>
> As it is, you need to create a second date/time variable, initialised
> by copying the value from the first one.  So instead of
>
>        my $day1 = $date1;
>
> do
>
>        my $day1 = $date1->clone;
>
> Then the ->add call will side-effect this second date/time variable,
> the one referenced by $day1, and leave the original date/time variable,
> the one referenced by $date1, alone.
>
> -zefram
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.