如何将符合ISO8601标准的字符串解析为perl的DateTime对象?

时间:2017-07-17 10:48:44

标签: perl datetime

我的最终目标是将当前日期和时间与采用ISO8601格式的TVMaze API返回的日期和时间进行比较,以确定是否播放了新的电视节目。

use strict;
use warnings;
use feature 'say';
use DateTime;
my $curmytime = DateTime->now()->format_cldr("yyyy-MM-dd'T'HH:mm:ssZ");
# Output is: Time now in UTC:2017-07-17T10:44:52+0000
say "Time now in UTC:". $curmytime;
my $strtobeparsed = '2017-04-09T21:00:00-0400';
# Next, parse the string "2017-04-09T21:00:00-0400" to a DateTime object

如何将字符串解析为DateTime对象?

1 个答案:

答案 0 :(得分:2)

DateTime does not parse dates and times。为此,您需要使用DateTime :: Format :: namespace中的众多模块之一。如果没有,则可以使用DateTime::Format::Strptime。给它一个pattern并将它交给一个字符串,它将为你创建一个DateTime对象。

use DateTime::Format::Strptime;
my $format = DateTime::Format::Strptime->new( pattern => '%FT%T%z');
my $dt = $format->parse_datetime( '2017-04-09T21:00:00-0400' );

然后,您可以将其与另一个DateTime进行比较。

print "ok" if $dt < DateTime->now;

如果你想将它变成自己的类,那也是相当微不足道的。

package DateTime::Format::TVMaze;
use strict;
use warnings;
use DateTime;
use parent 'DateTime::Format::Strptime';

sub new {
    my $class = shift;
    my %params = @_;

    $params{pattern} = '%FT%T%z';

    return $class->SUPER::new(%params);
}

现在你可以像这样使用它了

my $dt = DateTime::Format::TVMaze->new->parse_datetime('2017-04-09T21:00:00-0400');