【问题标题】:Converting ISO8601 duration (P3Y6M...) to seconds in perl在 perl 中将 ISO8601 持续时间(P3Y6M ...)转换为秒
【发布时间】:2017-10-26 08:36:52
【问题描述】:

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

【问题讨论】:

    标签: perl iso8601


    【解决方案1】:

    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
    

    【讨论】:

    • Re "但是,DateTime::Duration 格式不能用于将年转换为秒",可以;只是不容易。应该这样做:my $dt1 = DateTime-&gt;from_epoch( epoch =&gt; 0, time_zone =&gt; 'floating'); my $dt2 = $dt1-&gt;clone-&gt;add_duration($dur); my $secs = $dt2-&gt;delta_ms($dt1)-&gt;in_units('seconds');
    猜你喜欢
    • 2021-11-16
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多