我有以下代码:
$epoc = $rs->{'lastlogin'};
$date = localtime($epoc);
lastlogin
是一个Unix时间戳。
输出如下:Tue Jul 5 13:46:43 2016
我正在寻找Tue Jul 5 2016 13:46:43
。如您所见,年份被移到左侧一个位置。
我也是新手,所以我从这里尝试了一些匹配:Date and time functions in Perl,但是我找不到与Unix时间戳匹配的日期格式。
答案 0 :(得分:5)
函数));
是你的朋友。第一个参数是格式字符串,对于其余参数,可以使用POSIX::strftime
(或localtime()
)的结果,即gmtime()
,$year
,....格式字符串看起来有点类似于$month
的格式字符串,但允许一些特殊字符。例如,here解释了它们。
printf
输出:
#!/usr/bin/env perl
use strict;
use warnings;
use POSIX qw(strftime);
my $epoc = 1467743128;
print POSIX::strftime( '%a %b %e %Y %H:%M:%S', localtime($epoc) ), "\n";
(" Di"简称" Dienstag"这是"星期二"英文。)
Di Jul 5 2016 20:25:28
函数及其参数也在link you provided yourself解释。只需向下滚动即可看到。
您可能会对strftime
的行为感到困惑。当你写
localtime
然后在标量上下文中评估my $date = localtime($epoc);
。即localtime
注意到您将其返回值分配给标量(简单变量,而不是列表)。在这种情况下,它返回一个类似于日期和时间戳的可打印字符串。但是当在列表上下文中使用localtime
时,它会返回一个带有localtime
的元组(列表)。
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
POSIX::strftime( '%a %b %e %Y %H:%M:%S', localtime($epoc) )
在列表上下文中进行评估,这正是localtime
所期望的:格式字符串和列表。
strftime
答案 1 :(得分:5)
核心Time::Piece
会重载内置localtime
函数,以便它返回一个带有strftime
方法的对象,允许您根据需要格式化结果
(localtime
继续以相同的方式执行所有其他操作,因此您不会丢失任何功能。)
use strict;
use warnings 'all';
use Time::Piece;
my $rs = { lastlogin => 1467726403 };
my $epoc = $rs->{lastlogin};
my $date = localtime($epoc)->strftime('%a %b %d %Y %H:%M:%S');
print $date, "\n";
Tue Jul 05 2016 14:46:43
要将时间更改为12小时,您需要使用%I
格式说明符代替%H
,并在末尾添加%P
以提供{{1} }或AM
:
PM
my $date = localtime($epoc)->strftime('%a %b %d %Y %I:%M:%S %P');