我正在尝试将 ISO 8601 持续时间格式 P3Y6M4DT12H30M5S 转换为 perl 中的秒数。有图书馆可以做到这一点吗?我试过搜索,但我只找到了一个 js 库。查看 DateTime 和 Time::Moment 也没有提供解决方案。
最佳答案
有 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 所述。
您可以使用 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
关于perl - 将 ISO8601 持续时间(P3Y6M ...)转换为 perl 中的秒数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46949468/