在 perl 中打印 strfitime

print strfitime in perl

这是我当前的代码:

print "<td class=resa>@res[$i]->{'signupdate'}</td></tr>\n";

我想将变量 @res[$i]->{'signupdate'} 修改为 格式化日期 。该变量的数据是 201710130915

我试过:

use POSIX qw(strftime);
my $date=strftime('%Y-%m-%d',@res[$i]->{'signupdate'});
print "<td class=resa>$date</td></tr>\n";

有什么建议吗?

您拥有的数据看起来像是日期的字符串表示形式。

YYYYMMDDhhmm
201710130915

因此可以很容易地用模式匹配解构它并以不同的格式放回原处。

my $time = "201710130915";

my ($year, $month, $day) = $time =~ m/^(....)(..)(..)/;
my $date = sprintf '%d-%02d-%02d', $year, $month, $day;

print $date;

这将打印

2017-10-13

我猜你 运行 这个代码没有 use strictuse warnings。有了你代码中的那些(你应该总是在你的代码中包含它们)你会得到一个非常明确的警告。

你的代码基本上是这样的:

#!/usr/bin/perl

use strict;
use warnings;
use POSIX 'strftime';

my $input = '201710130915';

my $date = strftime('%Y-%m-%d', $input);
print $date;

并且 运行 给出了这个:

Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)

您使用 strftime() 的直觉很好。但是你需要给它正确的输入。你给它一个 date/time 字符串。实际上,它需要所有不同 date/time 值的单独输入。实际上,它需要 localtime().

返回的值列表

您可以创建一个数组,以正确的方式调整它们,然后以正确的顺序传递该数组的位:

#!/usr/bin/perl

use strict;
use warnings;
use POSIX 'strftime';

my $input = '201710130915';

my @date_bits = $input =~ /(....)(..)(..)(..)(..)/;
$date_bits[0] -= 1900;
$date_bits[1]--;
# The zero is for seconds.
my $date = strftime('%Y-%m-%d', 0, reverse @date_bits);
print $date;

但是,坦率地说,到那时您最好将其视为文本操作问题。

#!/usr/bin/perl

use strict;
use warnings;
use POSIX 'strftime';

my $input = '201710130915';

my $date = join '-', $input =~ /^(....)(..)(..)/;
print $date;