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

Orj*_*anp 3 perl iso8601

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

sim*_*que 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');
Run Code Online (Sandbox Code Playgroud)

但是,DateTime :: Duration格式不能用于将一年转换为秒,如此处的文档中所述.

最后一个示例表明,没有固定转换率的单元之间不会进行任何转换.唯一可能的转换是:

years <=> months
weeks <=> days
hours <=> minutes
seconds <=> nanoseconds
Run Code Online (Sandbox Code Playgroud)

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

您可以将DateTime :: Format :: Duration%s 模式一起使用来规避它.完整的实现可能如下所示.

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);
Run Code Online (Sandbox Code Playgroud)

或者,简而言之,如果您只需要一次.

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') );
Run Code Online (Sandbox Code Playgroud)

这两个都会打印出来

109254605
Run Code Online (Sandbox Code Playgroud)

  • 重新"*但是,DateTime :: Duration格式不能用于将一年转换为秒*",它可以; 只是不容易.这应该这样做:`my $ dt1 = DateTime-> from_epoch(epoch => 0,time_zone =>'floating'); my $ dt2 = $ dt1-> clone-> add_duration($ dur); 我的$ secs = $ dt2-> delta_ms($ dt1) - > in_units('seconds');` (2认同)