How do I convert epoch time to normal time in Perl?

匿名 (未验证) 提交于 2019-12-03 08:44:33

问题:

I am attempting to write a Perl script that parses a log where on each line the second value is the date. The script takes in three arguments: the input log file, the start time, and the end time. The start and end time are used to parse out a certain value on each line that that falls between those two times. But to properly run this I am converting the start and end time to epoch time. The problem I am having is that to convert the loops 'i' value back to normal time to compare against the log file. After running localtime($i) I print the value and only see a reference printed not the actual value.

Here is the script I have so far (it is a work in progress):

#!/usr/bin/perl use strict; use warnings; use Time::Local; use Time::localtime; use File::stat;  my $sec = 0; my $min = 0; my $hour = 0; my $mday = 0; my $mon = 0; my $year = 0; my $wday = 0; my $yday = 0; my $isdst = 0;  ########################## # Get the engine log date ########################## my $date = `grep -m 1 'Metric' "$ARGV[0]" | awk '{print \$2}'`; ($year,$mon,$mday) = split('-', $date); $mon--;  ######################################### # Calculate the start and end epoch time ######################################### ($hour,$min,$sec) = split(':', $ARGV[1]); my $startTime = timelocal($sec,$min,$hour,$mday,$mon,$year); ($hour,$min,$sec) = split(':', $ARGV[2]); my $endTime = timelocal($sec,$min,$hour,$mday,$mon,$year);   my $theTime = 0; for (my $i = $startTime; $i <= $endTime + 29; $i++) {         #print "$startTime   $i \n";          $theTime = localtime($i);          #my $DBInstance0 = `grep "$hour:$min:$sec" "$ARGV[0]"`;# | grep 'DBInstance-0' | awk '{print \$9}'`;         #print "$DBInstance0\n";         print "$theTime\n"; } print "$startTime   $endTime \n";

The output looks like:

Time::tm=ARRAY(0x8cbbd40) Time::tm=ARRAY(0x8cbc1a0) Time::tm=ARRAY(0x8cbbe80) Time::tm=ARRAY(0x8cbc190) Time::tm=ARRAY(0x8bbb170) Time::tm=ARRAY(0x8cbc180) Time::tm=ARRAY(0x8cbbf30) Time::tm=ARRAY(0x8cbc170) Time::tm=ARRAY(0x8cbc210) Time::tm=ARRAY(0x8cbc160) 1275760356   1275760773

I only have access to the core Perl modules and am unable to install any others.

回答1:

You can use ctime, depending on your definition of "Normal time":

Example code:

use Time::Local;  use Time::localtime;  my $time=timelocal(1,2,3,24,6,2010); print "$time\n";  $theTime = ctime($time);  print "$theTime\n";

Result:

1279954921 Sat Jul 24 03:02:01 2010

Also, you don't need to use Time::Localtime (which is why you get Time::tm instead of a standard array/string from Perl's internal localtime):

use Time::Local;  my $time=timelocal(1,2,3,24,6,2010);  print "$time\n";  $theTime = localtime($time);  print "$theTime\n";  1279954921 Sat Jul 24 03:02:01 2010


回答2:

Don't forget to subtract 1900 from the year!

Remember that in scalar context, localtime and gmtime returns a ctime-formatted string, so you could use it as in the following. If that's unsuitable, you might want to use strftime from the POSIX module.

#! /usr/bin/perl  use warnings; use strict;  use Time::Local;  my $start = "01:02:03"; my $end   = "01:02:05"; my $date  = "2010-02-10";  my($year,$mon,$mday) = split /-/, $date; $mon--; $year -= 1900;  my($startTime,$endTime) =   map { my($hour,$min,$sec) = split /:/;         timelocal $sec,$min,$hour,$mday,$mon,$year }   $start, $end;  for (my $i = $startTime; $i <= $endTime + 29; $i++) {   print scalar localtime($i), "\n"; }  print "$startTime   $endTime \n";

Tail of the output:

Wed Feb 10 01:02:26 2010 Wed Feb 10 01:02:27 2010 Wed Feb 10 01:02:28 2010 Wed Feb 10 01:02:29 2010 Wed Feb 10 01:02:30 2010 Wed Feb 10 01:02:31 2010 Wed Feb 10 01:02:32 2010 Wed Feb 10 01:02:33 2010 Wed Feb 10 01:02:34 2010 1265785323   1265785325


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!