如何在perl中从iso8601 datei和time获取日期格式

如何在perl中从iso8601 datei和time获取日期格式,perl,iso8601,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对象。然而,我被困在尝试只获得年-月日期格式

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]);
打印
2018-07-03T23:06:00
我怎么才能知道日期呢?我试着用

$dt = strftime('%Y-%m-%d',$dt);
但是我得到了以下错误

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.

我只是使用正则表达式来获取我要找的内容,还是有一种方法可以使用
DateTime::format::ISO8601
strftime
这里有两个名为
strftime()
的子例程,我想这会让您有点困惑

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

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

$dt->strftime('%Y-%m-%d'); # 2018-07-03
还值得一提的是,
strftime()
方法实际上只用于创建更模糊的日期和时间格式的字符串。对于常见格式,
DateTime
类有其他可以使用的方法。例如,可以使用
ymd()
方法生成所需的日期格式

$dt->ymd; # 2018-07-03

这意味着您可以从代码中删除
use POSIX
行。你根本不用那个模块。您所需要的一切都在
DateTime
类中。

这里有两个名为
strftime()
的子例程,我想这让您有些困惑

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

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

$dt->strftime('%Y-%m-%d'); # 2018-07-03
还值得一提的是,
strftime()
方法实际上只用于创建更模糊的日期和时间格式的字符串。对于常见格式,
DateTime
类有其他可以使用的方法。例如,可以使用
ymd()
方法生成所需的日期格式

$dt->ymd; # 2018-07-03

这意味着您可以从代码中删除
use POSIX
行。你根本不用那个模块。您需要的一切都在
DateTime
类中。

您可以使用DateTime::Format::Builder构建灵活的DateTime解析器。例如,您可以看到来自DateTime::Format::MySQL的源代码。 例如:

package MyTimeParser;
use strict;
use warnings;

use DateTime;
use DateTime::Format::Builder
(
    parsers => {
        parse_datetime => [
            {
                # 20180703T230600
                regex => qr/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})$/,
                params => [qw( year month day hour minute second )],
            },
            # here you can describe another format
        ],
    }
);
1;

package main;
use strict;
use warnings;

my $dt_str = 'Frank_Gibson.20180703T230600.Program_Manager.New_York.doc';
my @perl_time_array = split /\./, $dt_str;

# 2018-07-03
print MyTimeParser->parse_datetime( $perl_time_array[1] )->ymd('-');

exit;

您可以使用DateTime::Format::Builder构建灵活的DateTime解析器。例如,您可以看到来自DateTime::Format::MySQL的源代码。 例如:

package MyTimeParser;
use strict;
use warnings;

use DateTime;
use DateTime::Format::Builder
(
    parsers => {
        parse_datetime => [
            {
                # 20180703T230600
                regex => qr/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})$/,
                params => [qw( year month day hour minute second )],
            },
            # here you can describe another format
        ],
    }
);
1;

package main;
use strict;
use warnings;

my $dt_str = 'Frank_Gibson.20180703T230600.Program_Manager.New_York.doc';
my @perl_time_array = split /\./, $dt_str;

# 2018-07-03
print MyTimeParser->parse_datetime( $perl_time_array[1] )->ymd('-');

exit;

OP不是在寻找解析器,他们想要格式化他们的输出。这在
DateTime
类中已经可用。OP不是在寻找解析器,他们想要格式化他们的输出。这些都已经在
DateTime
类中提供了。