- 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; > }