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

时间:2019-10-24 08:47:53

标签: 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]);

打印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::ISO8601strftime进行格式化

2 个答案:

答案 0 :(得分:5)

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

您正在(意外地?)从POSIX模块调用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类中。

答案 1 :(得分:1)

您可以使用 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;