Dear Perl-ites,

I have a son working on his PhD in medical informatics, trying to
parse "portal" logs... and I THOUGHT I could help him extract the
time-  His data feed covers serval years... so many time 
calculations are required.

I read Dave Rolsky's "The Many Dates and Times of Perl",
and decided to try converting date-time strings into epoch-seconds
with Barr's  TimeDate-1.16, which I installed from CPAN last night.

The date and time info from the portal log file
looks like this:     Mon Aug 3, 2006 3:45 AM  (no seconds)

I Perl-ed it into:    Mon, 3 Aug 2006 3:45:00 GMT
which is one of the formats which  str2time is supposed to parse.

str2time converted it into epoch-seconds of:  1154576700

As a check, I immediately round-tripped this through time2str,
and got an inconsistent day-of-week:  Thu Aug 3 03:45:00 GMT 2006

What have I missed???  Do I have fighting use-statements?

Here are my particulars:

sys:  cygwin on Win2K,  fresh install 5 Oct 2006
perl -ver:   This is perl, v5.8.7 built for cygwin-thread-multi-64int

Perl-code:
Main program has these "Use" statements
use File::Basename;
use Getopt::Std;
use Time::Local

... code omitted 
  $epoch_sec = to_epoch("Mon Aug 3, 2006 3:45 AM");
...

# takes input containing portal-time
sub to_epoch  
{
  use Date::Parse;
  use Date::Format;
 
  local($ln1,$ln2,$time,$template);
  local($dow,$mon,$dom,$year,$hr,$min,$ampm);   # vars per input format
  $ln1 = shift;
  $ln1 =~ s/,//g; # strip comma from after day-of-month
  $ln1 =~ s/:/ /g; # replace colon between hr:min with space
  ($dow,$mon,$dom,$year,$hr,$min,$ampm) = split / /, $ln1;
  if ($ampm =~ m/PM/) {
    $hr = $hr + 12;
  }

  # format the line for the Date::Parse module
  $ln2 = $dow . ", " . $dom . " " . $mon . " " . $year . " " . $hr . ":" .
$min . ":00 GMT";
  $time = str2time($ln2);

  # test it, including a round-trip back to string
  #   template specifies string format... keep it simple
  $template = "%C";    # Date::Format ctime format

  if ($debug == 3) {
    print "\t\t to_epoch: mod'd = [$ln1] \n";
    print "\t\t to_epoch: built = [$ln2] \n";
    print "\t\t to_epoch: epoch = [$time] \n";
    print "\t\t to_epoch: back = [", time2str($template, $time, "GMT"), "]
\n"; 
  }
  return $time;
}

Results:
                 to_epoch:     mod'd = [Mon Aug 3 2006 3 45 AM]  
                 to_epoch:     built = [Mon, 3 Aug 2006 3:45:00 GMT]  
                 to_epoch:     epoch = [1154576700] 
                 to_epoch:     back  = [Thursday Thu Aug  3 03:45:00 GMT
2006] 

Any help appreciated,

Jim

Reply via email to