您正在尝试错误地使用POSIX::strftime()。检查the documentation 总是一个好主意,上面写着:
strftime
将日期和时间信息转换为字符串。返回字符串。
简介:
strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
月份 (mon)、工作日 (wday) 和年份 (yday) 从零开始,即一月是 0,而不是 1;星期日是 0,而不是 1; 1 月 1 日是 0,而不是 1。年份 (year ) 以 1900 年以来的年数给出,即 1995 年是 95; 2001 年是 101。有关这些和其他参数的详细信息,请参阅系统的 strftime() 联机帮助页。
因此,将包含日期时间的随机(ish)表示的字符串传递给它有点乐观。
您需要解析字符串并提取需要传递给strftime() 的位。正如您已经看到的那样,Modern Perl 做到这一点的方法是使用像 Time::Piece 这样的模块。但是使用标准 Perl 也完全可以做到这一点。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use POSIX 'strftime';
my $time = 'Fri Jan 8 14:24:27 2016';
my ($day, $mon, $date, $hr, $min, $sec, $year) = split /[\s:]+/, $time;
my %months = (
Jan => 0, Feb => 1, Mar => 2, Apr => 3,
May => 4, Jun => 5, Jul => 6, Aug => 7,
Sep => 8, Oct => 9, Nov => 10, Dec => 11,
);
$time = strftime('%Y%m%d',
$sec, $min, $hr, $date, $months{$mon}, $year - 1900);
say $time;
但不要那样做。使用模块。