将ISO8601持续时间(P3Y6M ...)转换为perl中的秒数

时间:2017-10-26 08:36:53

标签: perl iso8601

我试图将ISO 8601持续时间格式P3Y6M4DT12H30M5S转换为perl中的秒数。有没有这样做的图书馆?我尝试过搜索,但我只找到了一个js库。浏览DateTime和Time :: Moment也没有提供解决方案。

1 个答案:

答案 0 :(得分:6)

DateTime::Format::Duration::ISO8601,可以将ISO 8601持续时间字符串转换为DateTime::Duration对象。然后,您可以将其转换为秒。

use DateTime::Duration;
use DateTime::Format::Duration::ISO8601;

my $format = DateTime::Format::Duration::ISO8601->new;
my $d = $format->parse_duration('P3Y6M4DT12H30M5S');

但是,DateTime :: Duration格式不能用于将一年转换为秒,如in the docs here所述。

  

最后一个示例表明不会有任何转换   在没有固定转换率的单位之间。唯一的   转换可能是:

years <=> months
weeks <=> days
hours <=> minutes
seconds <=> nanoseconds
     

有关为何会出现这种情况的说明,请参阅DateTime.pm文档的How DateTime Math Works部分

您可以DateTime::Format::Duration%s pattern一起使用来规避这一点。完整的实现可能如下所示。

use DateTime::Duration;
use DateTime::Format::Duration::ISO8601;
use DateTime::Format::Duration;

my $format = DateTime::Format::Duration::ISO8601->new;
my $d      = $format->parse_duration('P3Y6M4DT12H30M5S');

my $output_format = DateTime::Format::Duration->new( pattern => '%s' );
print $output_format->format_duration($d);

或者,简而言之,如果你只需要一次。

use DateTime::Duration;
use DateTime::Format::Duration::ISO8601;
use DateTime::Format::Duration;

print DateTime::Format::Duration->new( pattern => '%s' )
    ->format_duration(
    DateTime::Format::Duration::ISO8601->new->parse_duration('P3Y6M4DT12H30M5S') );

这两个都会打印

109254605