我正在读一个包含时间戳的日志文件,我希望将其转换为人类可读的。 在此命令中,$ 1包含时间戳(如1403457192.663):$ temp = localtime-> mon($ 1)但是$ temp包含与输入相同的时间戳,而不是存储月份。我做错了什么?
答案 0 :(得分:1)
你很亲密。时间应该传递给localtime
函数,而不是mon
方法。:
$temp = localtime($1)->mon; # 6
您可以使用strftime
将其转换为任意格式
localtime($1)->strftime("%b %d %a"); # Jun 22 Sun
或者,如果你对这种格式不挑剔,你可以将其字符串化:
$temp = localtime($1);
print "$temp\n"; # Sun Jun 22 13:13:12 2014
这假定已加载Time::Piece
。
答案 1 :(得分:1)
我只是选择
$ 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
所有这些解决方案都失去了毫秒精度。如果相关,则必须从原始输入中提取它并将其重新插入输出中。
答案 2 :(得分:0)
对于格式化日期,大多数系统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
更容易使用; - )
答案 3 :(得分:-1)
自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.