25

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

4

7 回答 7

36

快速壳单线:

perl -le 'print scalar localtime 1357810480;'
Thu Jan 10 10:34:40 2013

或者,如果您碰巧在文件中有时间戳,则每行一个:

perl -lne 'print scalar localtime $_;' <timestamps
于 2013-02-25T23:19:50.807 回答
20

Time::Piece的完美使用(Perl 5.10 以来的标准)。

use 5.010;
use Time::Piece;

my $unix_timestamp = 1e9; # for example;

my $date = localtime($unix_timestamp)->strftime('%F %T'); # adjust format to taste

say $date; # 2001-09-09 02:46:40
于 2013-02-25T11:04:07.903 回答
18

你可以使用

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)如果更合适,可以替换为。

于 2013-02-25T10:12:31.043 回答
16

你可以使用localtime它。

my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($unix_timestamp);
于 2013-02-25T10:07:24.870 回答
6

或者,如果您有一个嵌入时间戳的文件,您可以使用以下命令将它们转换到位:

$ cat [file] | perl -pe 's/([\d]{10})/localtime $1/eg;'
于 2014-05-07T21:15:47.750 回答
0

我喜欢 JDawg 的回答,但无法让它在我正在使用的 RHEL 系统上正常工作。我能够让它工作。希望这会对某人有所帮助。它显示带有转换时间戳的文件的内容。

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

于 2017-07-25T16:05:46.530 回答
0

太添加到答案中,您还可以将 localtime 替换为 gmtime 以获取 UTC 时间。我发现这在我的 bash 脚本中非常有用:

世界标准时间:

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

当地的:

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

*如果您不需要在输出末尾换行,则可以say替换为。print

于 2020-07-02T23:24:09.160 回答