> - these are valid datetimes too:
>
>     --10-11   # 10-11 current year
>     2001-300   # 300th day of 2001
>
> - there also week-day formats, periods,

they're valid dates according to the spec, but are they datetimes? i'm
willing to add support for this later or accept a patch :)

> and fractional times.

fractional seconds? that is correctly parsed, but unused, since it
wouldn't make much sense in the context of a unix timestamp.

>   see also: Date::Tie

didn't seem to apply here. i want to parse datetime strings, not construct
them.


> [EMAIL PROTECTED] wrote:
> >
> > there doesn't seem to be a module that takes datetimes as described by ISO
> > 8601 (http://www.cl.cam.ac.uk/~mgk25/iso-time.html) and converts them to a
> > unix timestamp. several other modules came close, but are missing a few
> > things.
> >
> > this module will provide a single function ToUnixTime
> > (suggestions welcome on a better name) that converts datetimes like:
> >   19951231T235959
> >   2001-10-11T11:43:00,0
> >   2002-07-14T22:34:59+00:00
> > into unix timestamps.
> >
> > if a time offset is not present in the string, UTC is used. a different
> > default timezone may be passed in as an argument like so:
> >   DateTime::ISO::ToUnixTime($datetime, zone=>'EST5EDT')
> >
> > comments?
> >
> > thanks
> >
> > code follows below if you're interested in implementation:
> >
> > sub ToUnixTime ($@)
> > {
> >   my $date = shift || return;
> >   my %args = @_;
> >   my $zone = delete $args{zone} || 'UTC';
> >
> >   my @match = $date =~ m
> >   {
> >     ^
> >     (\d\d\d\d)            # $1 = YYYY
> >     -?
> >     (\d\d)                # $2 = MM
> >     -?
> >     (\d\d)                # $3 = DD
> >     [ T]
> >     (\d\d)                # $4 = hh
> >     (?:
> >        :?
> >        (\d\d)             # $5 = mm
> >        (?:
> >           :?
> >           (\d\d)          # $6 = ss
> >           (?:[.,]\d+)?    # fractions of seconds
> >        )?
> >     )?
> >     (?:
> >        ([+-]?\d\d)        # $7 = timezone hh
> >        (?:
> >           :?
> >           (\d\d)          # $8 = timezone mm
> >        )?
> >        |
> >        Z
> >     )?
> >     $
> >   }x;
> >
> >   unless (@match)
> >   {
> >     $@ = 'unknow date format';
> >     return;
> >   }
> >
> >   my ($YYYY, $MM, $DD, $hh, $mm, $ss, $zhh, $zmm) = @match;
> >   $mm ||= 0;
> >   $ss ||= 0;
> >
> >   require Time::Local;
> >
> >   ## Time::Local croaks on bad values.
> >   my $time = eval {
> >     local $ENV{TZ} = $zone;
> >     Time::Local::timelocal($ss, $mm, $hh, $DD, $MM-1, $YYYY-1900);
> >   };
> >   return if $@;
> >
> >   delete $ENV{TZ} unless $ENV{TZ};  ## local()izing leaves a "ghost" value.
> >
> >   ## Adjust for tz offset.
> >   $time -= $zhh * 60 * 60 if $zhh;
> >   $time -= $zmm * 60      if $zmm;
> >
> >   return $time;
> > }
>
>


Reply via email to