преобразовать временную метку perl в удобочитаемую

#perl #timestamp

#perl #временная метка

Вопрос:

Я читаю файл журнала, который содержит временные метки, которые я хочу преобразовать в удобочитаемые. В этой команде $ 1 содержит временную метку (например, 1403457192.663): $ temp = localtime-> mon($ 1) но вместо сохранения месяца, $ temp содержит ту же временную метку, которая была введена. Что я делаю не так?

Ответ №1:

Вы уже близко. Время должно быть передано localtime функции, а не mon методу.:

 $temp = localtime($1)->mon; # 6
 

Вы можете использовать strftime это, чтобы превратить его в любой произвольный формат

 localtime($1)->strftime("%b %d %a"); # Jun 22 Sun
 

Или, если вы не придирчивы к формату, вы можете просто преобразовать его в строку:

 $temp = localtime($1);
print "$tempn"; # Sun Jun 22 13:13:12 2014
 

Это предполагает, что Time::Piece загружено.

Комментарии:

1. А как насчет тебя strftime , старина?

2. Я использую Time::localtime; … похоже, это работает … или я должен использовать Time::Piece?

Ответ №2:

Я бы просто пошел с

 $ perl -E'
   use POSIX qw( strftime );
   say strftime("%Y/%m/%d %H:%M:%S", localtime(1403457192.663));
'
2014/06/22 13:13:12
 

Но вы используете Time::localtime . Этот модуль переопределяет localtime встроенный, поэтому вам потребуется небольшая модификация, если вы его используете.

Либо избегайте использования Time::localtime localtime

 $ perl -E'
   use POSIX           qw( strftime );
   use Time::localtime qw( localtime );
   say strftime("%Y/%m/%d %H:%M:%S", CORE::localtime(1403457192.663));
'
2014/06/22 13:13:12
 

или сгладить существующий объект Time::localtime.

 $ perl -E'
   use POSIX           qw( strftime );
   use Time::localtime qw( localtime );
   my $tm = localtime(1403457192.663);
   say strftime("%Y/%m/%d %H:%M:%S", @$tm);
'
2014/06/22 13:13:12
 

Все эти решения теряют точность в миллисекундах. Если это важно, вам нужно будет извлечь его из исходного ввода и повторно вставить в вывод.

Ответ №3:

Для форматирования дат на большинстве strftime страниц системного руководства будет указано несколько «ярлыков» для получения определенных «стандартных» форматов.

например %F , эквивалентно “%Y-%m-%d” .

 ~/% perl -MPOSIX -E'say strftime"%D",localtime'
06/25/14
~/% perl -MPOSIX -E'say strftime"%F",localtime'
2014-06-25
 

Это может упростить использование «ye olde» strftime 😉

Ответ №4:

Начиная с версии 5.10, Perl теперь содержит Time::Piece . Это делает его официальным способом обработки времени в Perl. Или, примерно так же официально, как что-то в Perl. Поскольку она всегда доступна, вы могли бы также научиться использовать это:

 use strict;
use warnings;
use Time::Piece;
use Time::Seconds;   # More time fun!

my $time = Time::Piece->new;   # Gets the current timestamp

my $month = $time->mon();          # Month from 1 to 12
my $month = $time->month();        # Abbreviation of the name of month
my $month = $time->fullmonth();    # Full name of the month
my $time = $time   (ONE_DAY * 30)  # Add thirty days to the time
my $date = $time->mdy              # The date 30 days from now.
 

Комментарии:

1. Наличие модуля в ядре не подразумевает рекомендации по его использованию. На самом деле, я настоятельно рекомендую не использовать Time::Seconds . Его очень легко использовать неправильно, не осознавая этого, потому что это заставляет вас писать код, который выглядит некорректно. (Количество секунд в день не является постоянным.)