Как преобразовать время эпохи в обычное время в Perl? - PullRequest
6 голосов
/ 26 июня 2010

Я пытаюсь написать сценарий Perl, который анализирует журнал, где в каждой строке второе значение является датой. Сценарий принимает три аргумента: входной файл журнала, время начала и время окончания. Время начала и окончания используются для анализа определенного значения в каждой строке, которое находится между этими двумя значениями. Но чтобы правильно запустить это, я конвертирую время начала и окончания в время эпохи. Проблема, которую я имею, состоит в том, чтобы преобразовать значение 'i' циклов обратно в обычное время для сравнения с файлом журнала. После запуска localtime($i) я печатаю значение и вижу только напечатанную ссылку, а не фактическое значение.

Вот сценарий, который у меня есть (идет работа):

#!/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";

Вывод выглядит так:

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

У меня есть доступ только к основным модулям Perl, и я не могу установить другие.

Ответы [ 2 ]

3 голосов
/ 26 июня 2010

Вы можете использовать ctime, в зависимости от вашего определения «Нормального времени»:

Пример кода:

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

Результат:

1279954921
Sat Jul 24 03:02:01 2010

Такжевам не нужно использовать Time :: Localtime (, поэтому вы получаете Time :: tm вместо стандартного массива / строки из внутреннего localtime Perl):

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 голосов
/ 26 июня 2010

Не забудьте вычесть 1900 из года!

Помните, что в скалярном контексте localtime и gmtime возвращает строку в формате ctime, так что вы можете использовать ее как вследующий.Если это не подходит, вы можете использовать strftime из модуля POSIX.

#! /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";

Хвост выхода:

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
...