#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 . Его очень легко использовать неправильно, не осознавая этого, потому что это заставляет вас писать код, который выглядит некорректно. (Количество секунд в день не является постоянным.)