将perl时间戳转换为人类可读的

时间:2014-06-24 18:28:30

标签: perl timestamp

我正在读一个包含时间戳的日志文件,我希望将其转换为人类可读的。 在此命令中,$ 1包含时间戳(如1403457192.663):$ temp = localtime-> mon($ 1)但是$ temp包含与输入相同的时间戳,而不是存储月份。我做错了什么?

4 个答案:

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