我有一个字符串,其中包含一个格式的日期
my $time = 'Fri Jan 8 14:24:27 2016';
我想把它转换成YYYYMMDD。我尝试了几个选项,例如:
use POSIX qw(strftime);
print strftime("%Y%m%d", $time);
但这行不通。尝试过localtime($time)
以及其他许多方法,但都不起作用。
我想我需要将其转换为中间格式吗?
注意:我需要使用strftime/POSIX,因为有很多原因我不能调用其他模块。(无日期::时间等(
提前感谢
使用时间::Piece,自2007年以来一直是Perl核心的一部分:
use Time::Piece;
my $time = 'Fri Jan 8 14:24:27 2016';
say Time::Piece->strptime($time, '%a %b %d %H:%M:%S %Y')->ymd("");
您试图错误地使用POSIX::strftime()
。检查文档总是一个好主意,上面写着:
strftime
将日期和时间信息转换为字符串。返回字符串。
简介:
strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
月份(
mon
(、工作日(wday
(和年份(yday
(从零开始,即1月是0,而不是1;星期日是0,而不是1;1月1日是0,而不是1。年份(年(以1900年以来的年份为单位,即1995年为95年;2001年是101年。有关这些参数和其他参数的详细信息,请参阅系统的strftime()
手册页。
因此,向它传递一个包含日期时间的随机(ish(表示的字符串有点乐观。
您需要解析字符串并提取需要传递给strftime()
的位。正如您已经展示的那样,实现这一点的现代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;
但不要那样做。使用模块。