Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > Perl Misc > How to convert timestamp to epoch?

Reply
Thread Tools

How to convert timestamp to epoch?

 
 
void.no.spam.com@gmail.com
Guest
Posts: n/a
 
      10-30-2007
If I get timestamps in the following format:

22-OCT-07 06.16.44.160000 PM
22-OCT-07 08.16.02.686000 AM

What is the easiest way for me to convert it into the number of
seconds since 1970?

 
Reply With Quote
 
 
 
 
TonyV
Guest
Posts: n/a
 
      10-30-2007
On Oct 30, 2:45 pm, "void.no.spam....@gmail.com"
<void.no.spam....@gmail.com> wrote:
> If I get timestamps in the following format:
>
> 22-OCT-07 06.16.44.160000 PM
> 22-OCT-07 08.16.02.686000 AM
>
> What is the easiest way for me to convert it into the number of
> seconds since 1970?


I would probably make it a function:

use Time::Local;

my $ts_to_convert = '22-jun-07 06.16.44.160000 PM';
print timestamp_to_epoch($ts_to_convert);

sub timestamp_to_epoch {
my ($ts) = @_;
my %month = ('JAN' => 0, 'FEB' => 1, 'MAR' => 2, 'APR' => 3, 'MAY'
=> 4, 'JUN' => 5,
'JUL' => 6, 'AUG' => 7, 'SEP' => 8, 'OCT' => 9, 'NOV' => 10, 'DEC'
=> 11);
if ($ts =~ m{^(\d{1,2})-(\w{1,3})-(\d{1,2}) (\d{1,2})\.(\d{1,2})\.
(\d{1,2})\.\d+ ([AP])M$}i) {
my ($dd, $mo, $yy, $hh, $mm, $ss, $ap) = ($1, $2, $3, $4, $5, $6,
$7);
$yy += 2000; $mo = $month{uc($mo)};
$hh += 12 if (uc($ap) eq 'P');
return timelocal($ss, $mm, $hh, $dd, $mo, $yy);
}
else { return 0; }
}


Check to make sure your return value is non-zero, and you're in
business.

You might also want to check out the Date::Manip package, as I
understand that it was designed to do this type of parsing. I don't
use it myself, so I'll defer to others' recommendations for it, but
here it is:
http://search.cpan.org/dist/Date-Manip/Manip.pod

 
Reply With Quote
 
 
 
 
TonyV
Guest
Posts: n/a
 
      10-30-2007
On Oct 30, 3:15 pm, TonyV <kingskip...@gmail.com> wrote:
> On Oct 30, 2:45 pm, "void.no.spam....@gmail.com"
>
> <void.no.spam....@gmail.com> wrote:
> > If I get timestamps in the following format:

>
> > 22-OCT-07 06.16.44.160000 PM
> > 22-OCT-07 08.16.02.686000 AM

>
> > What is the easiest way for me to convert it into the number of
> > seconds since 1970?

>
> I would probably make it a function:


Gah, here's a more word-wrap-friendly version:

use Time::Local;

my $ts_to_convert = '22-jun-07 06.16.44.160000 PM';
print timestamp_to_epoch($ts_to_convert);

sub timestamp_to_epoch {
my ($ts) = @_;
my %month = (
'JAN' => 0, 'FEB' => 1, 'MAR' => 2, 'APR' => 3,
'MAY' => 4, 'JUN' => 5, 'JUL' => 6, 'AUG' => 7,
'SEP' => 8, 'OCT' => 9, 'NOV' => 10, 'DEC' => 11);
my $regex = '^(\d{1,2})-(\w{1,3})-(\d{1,2}) ';
$regex .= '(\d{1,2})\.(\d{1,2})\.(\d{1,2})';
$regex .= '\.\d+ ([AP])M$';
if ($ts =~ m{$regex}i) {
my ($dd, $mo, $yy, $hh, $mm, $ss, $ap) =
($1, $2, $3, $4, $5, $6, $7);
$yy += 2000; $mo = $month{uc($mo)};
$hh += 12 if (uc($ap) eq 'P');
return timelocal($ss, $mm, $hh, $dd, $mo, $yy);
}
else { return 0; }
}

 
Reply With Quote
 
Paul Lalli
Guest
Posts: n/a
 
      10-30-2007
On Oct 30, 2:45 pm, "void.no.spam....@gmail.com"
<void.no.spam....@gmail.com> wrote:
> If I get timestamps in the following format:
>
> 22-OCT-07 06.16.44.160000 PM
> 22-OCT-07 08.16.02.686000 AM
>
> What is the easiest way for me to convert it into the number of
> seconds since 1970?


If you convert those first two periods to colons, Date:arse can
handle it just fine:

#!/usr/bin/perl
use strict;
use warnings;
use Date:arse 'str2time';
my $date = "22-OCT-07 06.16.44.160000 PM";
$date =~ s/\./:/ for 1..2;
my $epoch = str2time($date);
print "Epoch: $epoch\n";
__END__

Paul Lalli

 
Reply With Quote
 
void.no.spam.com@gmail.com
Guest
Posts: n/a
 
      10-30-2007
On Oct 30, 3:27 pm, TonyV <kingskip...@gmail.com> wrote:
> On Oct 30, 3:15 pm, TonyV <kingskip...@gmail.com> wrote:
>
> > On Oct 30, 2:45 pm, "void.no.spam....@gmail.com"

>
> > <void.no.spam....@gmail.com> wrote:
> > > If I get timestamps in the following format:

>
> > > 22-OCT-07 06.16.44.160000 PM
> > > 22-OCT-07 08.16.02.686000 AM

>
> > > What is the easiest way for me to convert it into the number of
> > > seconds since 1970?

>
> > I would probably make it a function:

>
> Gah, here's a more word-wrap-friendly version:
>
> use Time::Local;
>
> my $ts_to_convert = '22-jun-07 06.16.44.160000 PM';
> print timestamp_to_epoch($ts_to_convert);
>
> sub timestamp_to_epoch {
> my ($ts) = @_;
> my %month = (
> 'JAN' => 0, 'FEB' => 1, 'MAR' => 2, 'APR' => 3,
> 'MAY' => 4, 'JUN' => 5, 'JUL' => 6, 'AUG' => 7,
> 'SEP' => 8, 'OCT' => 9, 'NOV' => 10, 'DEC' => 11);
> my $regex = '^(\d{1,2})-(\w{1,3})-(\d{1,2}) ';
> $regex .= '(\d{1,2})\.(\d{1,2})\.(\d{1,2})';
> $regex .= '\.\d+ ([AP])M$';
> if ($ts =~ m{$regex}i) {
> my ($dd, $mo, $yy, $hh, $mm, $ss, $ap) =
> ($1, $2, $3, $4, $5, $6, $7);
> $yy += 2000; $mo = $month{uc($mo)};
> $hh += 12 if (uc($ap) eq 'P');
> return timelocal($ss, $mm, $hh, $dd, $mo, $yy);
> }
> else { return 0; }
>
>
>
> }


Thank you for writing that up.

I did have to change one line to get it to work:

sub timestamp_to_epoch {
my ($ts) = @_;
my %month = (
'JAN' => 0, 'FEB' => 1, 'MAR' => 2, 'APR' => 3,
'MAY' => 4, 'JUN' => 5, 'JUL' => 6, 'AUG' => 7,
'SEP' => 8, 'OCT' => 9, 'NOV' => 10, 'DEC' => 11);
my $regex = '^(\d{1,2})-(\w{1,3})-(\d{1,2}) ';
$regex .= '(\d{1,2})\.(\d{1,2})\.(\d{1,2})';
$regex .= '\.\d+ ([AP])M$';
if ($ts =~ m{$regex}i) {
my ($dd, $mo, $yy, $hh, $mm, $ss, $ap) =
($1, $2, $3, $4, $5, $6, $7);
$yy += 2000; $mo = $month{uc($mo)};
$hh += 12 if (uc($ap) eq 'P' && $hh != 12);
return timelocal($ss, $mm, $hh, $dd, $mo, $yy);
}
else { return 0; }
}

 
Reply With Quote
 
jl_post@hotmail.com
Guest
Posts: n/a
 
      10-30-2007
On Oct 30, 1:27 pm, TonyV <kingskip...@gmail.com> wrote:
>
> use Time::Local;
>
> my $ts_to_convert = '22-jun-07 06.16.44.160000 PM';
> print timestamp_to_epoch($ts_to_convert);
>
> sub timestamp_to_epoch {
> my ($ts) = @_;
> my %month = (
> 'JAN' => 0, 'FEB' => 1, 'MAR' => 2, 'APR' => 3,
> 'MAY' => 4, 'JUN' => 5, 'JUL' => 6, 'AUG' => 7,
> 'SEP' => 8, 'OCT' => 9, 'NOV' => 10, 'DEC' => 11);
> my $regex = '^(\d{1,2})-(\w{1,3})-(\d{1,2}) ';
> $regex .= '(\d{1,2})\.(\d{1,2})\.(\d{1,2})';
> $regex .= '\.\d+ ([AP])M$';
> if ($ts =~ m{$regex}i) {
> my ($dd, $mo, $yy, $hh, $mm, $ss, $ap) =
> ($1, $2, $3, $4, $5, $6, $7);
> $yy += 2000; $mo = $month{uc($mo)};
> $hh += 12 if (uc($ap) eq 'P');
> return timelocal($ss, $mm, $hh, $dd, $mo, $yy);
> }
> else { return 0; }
> }



Ummm... this code has a subtle error in it: it won't correctly
convert dates with "12" as the hour. To see what I mean, try running
your code with this line:

my $ts_to_convert = '22-JUN-07 12.16.44.160000 PM';

Instead of an epoch time value, you'll see an error message like:

Hour '24' out of range 0..23

Converting 12-hour AM/PM time to 24-hour time (and vice-versa) is a
little trickier than many people think. They often forget to check
the cases where the hour equals 12, thinking that simply adding 12 to
the hour (if they are in PM) is enough to convert from 12-hour to 24-
hour time (like in the code you gave).

But "12:00 am" needs to be converted to "00:00" and "12:00 pm"
needs to be converted to "12:00", and just adding 12 to the hour value
won't correctly convert either.

 
Reply With Quote
 
void.no.spam.com@gmail.com
Guest
Posts: n/a
 
      10-30-2007
Oops, actually this is the working version:

sub timestamp_to_epoch {
my ($ts) = @_;
my %month = (
'JAN' => 0, 'FEB' => 1, 'MAR' => 2, 'APR' => 3,
'MAY' => 4, 'JUN' => 5, 'JUL' => 6, 'AUG' => 7,
'SEP' => 8, 'OCT' => 9, 'NOV' => 10, 'DEC' => 11);
my $regex = '^(\d{1,2})-(\w{1,3})-(\d{1,2}) ';
$regex .= '(\d{1,2})\.(\d{1,2})\.(\d{1,2})';
$regex .= '\.\d+ ([AP])M$';
if ($ts =~ m{$regex}i) {
my ($dd, $mo, $yy, $hh, $mm, $ss, $ap) =
($1, $2, $3, $4, $5, $6, $7);
$yy += 2000; $mo = $month{uc($mo)};
if (uc($ap) eq 'P' && $hh != 12) {
$hh += 12;
}
elsif (uc($ap) eq 'A' && $hh == 12) {
$hh -= 12;
}
return timelocal($ss, $mm, $hh, $dd, $mo, $yy);
}
else { return 0; }
}

 
Reply With Quote
 
TonyV
Guest
Posts: n/a
 
      10-30-2007
On Oct 30, 5:42 pm, "void.no.spam....@gmail.com"
<void.no.spam....@gmail.com> wrote:
> Oops, actually this is the working version:


Great catch, I usually deal exclusively with 24-hour time, which is
why I probably introduced that bug in. I wish we could get rid of
that pesky AM/PM format entirely, even from our everyday, normal
lives.

 
Reply With Quote
 
usenet@DavidFilmer.com
Guest
Posts: n/a
 
      10-31-2007
On Oct 30, 11:47 am, Paul Lalli <mri...@gmail.com> wrote:
> $date =~ s/\./:/ for 1..2;


That's a nifty little idiom that I would not have thought of (I would
have probably constructed some ugly regexp). I'm gonna write that
down on my Perl cheat-sheet!

--
The best way to get a good answer is to ask a good question.
David Filmer (http://DavidFilmer.com)

 
Reply With Quote
 
jl_post@hotmail.com
Guest
Posts: n/a
 
      10-31-2007
On Oct 30, 1:47 pm, Paul Lalli <mri...@gmail.com> wrote:
>
> #!/usr/bin/perl
> use strict;
> use warnings;
> use Date:arse 'str2time';
> my $date = "22-OCT-07 06.16.44.160000 PM";
> $date =~ s/\./:/ for 1..2;
> my $epoch = str2time($date);
> print "Epoch: $epoch\n";
> __END__



The Date:arse module looks great, but I can't seem to find it in
my ActiveState distribution of Perl, nor am I successful in installing
it with the command "ppm install Date-Parse".

Is there any one out there who is running ActiveState Perl and has
it, or am I the only one who's missing the Date:arse module? In
case anyone wonders, my "perl -v" output is:

This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 33 registered patches, see perl -V for more detail)

Copyright 1987-2006, Larry Wall

Binary build 819 [267479] provided by ActiveState http://www.ActiveState.com
Built Aug 29 2006 12:42:41

Thanks.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Convert Unix timestamp to Readable Date/time kaklis@gmail.com Python 1 07-22-2010 01:01 PM
Convert date/time to unix timestamp? Phillip B Oldham Python 2 02-10-2009 01:25 PM
how to convert date to unix timestamp Fibre Optic C++ 1 02-23-2007 12:30 PM
Convert to NTP Timestamp Manzoorul Hassan Perl 1 03-11-2005 05:37 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57