On Tue, 14 Jan 2003, srl wrote:

> > > gives:
> > >   [19700329T020000..19701025T030000],
> > >   [19710328T020000..19711031T030000],
> > >   [19720326T020000..19721030T030000]
> > >
> > > The format of the time strings and the recurrence rules are defined
> > > in the iCalendar rfc (2445). This was used because the primary use
> > > of Date::Set was going to be Net::ICal. (not that I'm aware of
> > > any other syntaxes to specify recurrences in)
> >
> > Wouldn't it be better to specify them in something a little more primitive
> > (numbers, not a string)?
>
> In iCalendar, the string has significance, because timezones
> can be specified as part of it:
>
> "19720326T020000Z" is that date/time in UTC;
> "19720326T020000;America/New_York" is that date/time in New York,
> whether New York's in daylight savings or standard time.

I was just suggesting that those are better stored in a more optimized
manner, perhaps, since Perl doesn't natively operate on ICal strings.  And
in the case of storing sets for datetimes, the datetimes stored should
almost definitely be in UTC.

> > The base object will store UTC only, and then use the timezone objects to
> > do other things.  So if we 19700328T233000Z and add 4 hours, we end up
> > with 19700329T033000Z.  And if the timezone is Europe/Amsterdam, then when
> > the user asks for ->hour, they get the right answer.
>
> Where "right answer" involves knowing whether Amsterdam is in
> DST or not right now, I assume?

Right.  It'll look something like this:

  my $dt = DateTime->new( ical => '19700328T233000' );
  $dt->add( hours => 4 );

  $dt->set_timezone( $amsterdam_tz );

  print $dt->hour;

then internally

  my $offset = $self->timezone->offset_for($self);

  return ($self + $offset)->hour;

Where convert_to_tz looks like this:

  sub offset_for
  {
      my ($self, $dt) = @_;

      # do a lookup to find if $dt represents a DST or non-DST time

      return $appropriate_offset; # as DateTime::Duration object
  }

This could obviously be optimized, but the point here is to show the
separation of responsibilities.  DateTime.pm _only_ knows about UTC times.
Timezone objects generate an offset _based on a given UTC time_.  There's
no such thing as an offset without a specific datetime.


-dave

/*=======================
House Absolute Consulting
www.houseabsolute.com
=======================*/

Reply via email to