Perl中的日期格式问题

时间:2016-07-05 18:14:23

标签: perl

我有以下代码:

    $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时间戳匹配的日期格式。

2 个答案:

答案 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');