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

标签 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 对象?

最佳答案

DateTime does not parse dates and times .为此,您需要使用 DateTime::Format::命名空间中的众多模块之一。如果没有可用的,您可以简单地使用 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');

关于perl - 如何将符合 ISO8601 的字符串解析为 perl 的 DateTime 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45142232/

相关文章:

perl - &$func($arg) 和 $func->($arg) 之间有什么区别吗?

mysql - grails/mysql 时区更改

javascript - 计算可预订资源的可用时段

c# - CultureInfo.GetCultureInfo ("en-GB")与 en-US 日期格式不兼容,但与其他格式兼容

php - 从本周的订单表中提取记录

perl - Perl 中的未定义数组

perl - 如何在没有 root 访问权限的情况下在本地安装 CPAN 模块(DynaLoader.pm 第 229 行错误)?

php - 如何捕获 Windows cmd shell 的输出?

perl - 如何在 perl 中运行多个测试脚本并提供另一个参数?

Perl DateTime "is_dst()"方法无法正常工作