在Perl中将Unix时间戳转换为可读的日期

在Perl中将Unix时间戳转换为可读的日期,perl,timestamp,Perl,Timestamp,我有一些Unix时间戳(例如,1357810480,所以它们主要是在过去)。如何使用Perl将它们转换为可读的日期格式?您可以使用它 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($unix_timestamp); 你可以用 my ($S, $M, $H, $d, $m, $Y) = localtime($time); $m += 1; $Y += 1900; my $dt = spri

我有一些Unix时间戳(例如,1357810480,所以它们主要是在过去)。如何使用Perl将它们转换为可读的日期格式?

您可以使用它

my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($unix_timestamp);
你可以用

my ($S, $M, $H, $d, $m, $Y) = localtime($time);
$m += 1;
$Y += 1900;
my $dt = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $Y,$m, $d, $H, $M, $S);
但使用strftime时,它会稍微简单一些:

use POSIX qw( strftime );
my $dt = strftime("%Y-%m-%d %H:%M:%S", localtime($time));
localtime($time)
如果更合适,可以用
gmtime($time)
替换。

是(自5.10以来的Perl标准版)的完美用法

快速外壳一衬板:

perl -le 'print scalar localtime 1357810480;'
Thu Jan 10 10:34:40 2013
或者,如果文件中碰巧有时间戳,则每行一个:

perl -lne 'print scalar localtime $_;' <timestamps

perl-lne“打印标量本地时间$” 或者,如果您有一个带有嵌入时间戳的文件,您可以使用以下方法就地转换它们:

$ cat [file] | perl -pe 's/([\d]{10})/localtime $1/eg;'

我喜欢JDawg的答案,但无法让它在我正在开发的RHEL系统上正常工作。我能让它工作。希望这能帮助一些人。它显示文件的内容以及转换后的时间戳


cat filename | perl-pe's/(\d+)/localtime($1)/e'

除了答案之外,您还可以将localtime替换为gmtime以获得UTC时间。我发现这在我的bash脚本中非常有用:

UTC:

本地:

echo 1357810480  | perl -nE 'say scalar localtime $_'

*如果不需要在输出末尾添加新行,可以将
say
替换为
print

是的,这会将数组放入
$time
。例如,在这之后,小时在
$time[2]
中。谢谢,但我想将格式化的日期直接存储在一个变量中。你认为这有可能吗?我当前的解决方案似乎保存了当前日期,不管给定的时间戳有多旧(一种方式是
$formatted\u time=scalar(localtime($unix\u timestamp))
,或者使用,
$formatted\u time=time2str(“%D”),$unix\u timestamp)@hurley,它返回给定时间戳的数据,而不是“当前日期”。这正是我需要的!我可以通过管道将日志文件导入perl一行程序和宾果即时日期/时间。
'%f%T'
对我不起作用(可能是因为我的区域设置),但
'%Y-%m-%d'
确实起作用。Time::Piece对时区的奇怪和错误处理让我发誓放弃。它可用于将时间戳转换为字符串,但尝试从Time::Piece对象提取时间戳会产生意外且不可靠的结果。它会改变时间戳以匹配机器的时区,实际上会增加或减少秒数,从而导致时间戳不准确。当您稍后检索您的时间戳时,您将发现它已关闭x小时。
echo 1357810480  | perl -nE 'say scalar gmtime $_'
echo 1357810480  | perl -nE 'say scalar localtime $_'