- these are valid datetimes too:
--10-11 # 10-11 current year
2001-300 # 300th day of 2001
- there also week-day formats, periods, and fractional times.
- Yahoo group "ISO8601" has some good references.
- Fl�vio S. Glock
see also: Date::Tie
[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;
> }