如何从ISO8601 Datei和Perl中的时间获取日期格式

new*_*per 1 perl iso8601

我正在解析数据并获取日期。然后,我将其转换为iso8601对象。但是,我一直试图仅获取年份月份日期格式。

use DateTime::Format::ISO8601;
use POSIX qw(strftime);
my $dt_str = 'Frank_Gibson.20180703T230600.Program_Manager.New_York.doc';
my @perl_time_array = split /\./, $dt_str;
my $dt = DateTime::Format::ISO8601->parse_datetime($perl_time_array[1]);
Run Code Online (Sandbox Code Playgroud)

打印2018-07-03T23:06:00 我如何获取日期?我尝试使用

$dt = strftime('%Y-%m-%d',$dt);
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误。

Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at /home/pi/code/perl/perl_regex_lookahead.pl line 26.
Run Code Online (Sandbox Code Playgroud)

我是否仅使用正则表达式来获取所需的内容,还是可以使用DateTime::Format::ISO8601或来格式化?strftime

Dav*_*oss 5

这里有两个子例程strftime(),我认为这会使您感到困惑。

您正在(意外地?)strftime()POSIX模块中调用该函数,并且正如您的错误消息所告诉您的那样,该子例程需要非常特定的参数(基本上是从localtime()或返回的值的列表gmtime())。

但是您不需要这样做。您的$dt变量是该类的对象DateTime。和DateTime对象都有自己的strftime()方法,你可以在对象上调用。

$dt->strftime('%Y-%m-%d'); # 2018-07-03
Run Code Online (Sandbox Code Playgroud)

还值得一提的是,该strftime()方法仅用于创建日期和时间格式更加晦涩的字符串。对于常见格式,DateTime该类还可以使用其他方法。例如,可以使用该ymd()方法生成所需的日期格式。

$dt->ymd; # 2018-07-03
Run Code Online (Sandbox Code Playgroud)

这一切都意味着您可以use POSIX从代码中删除该行。您根本不会使用该模块。您需要的一切都在DateTime课堂上。