【发布时间】:2017-10-26 08:36:52
【问题描述】:
我正在尝试将ISO 8601 持续时间格式 P3Y6M4DT12H30M5S 转换为 perl 中的秒数。有没有这样做的图书馆?我试过搜索,但我只找到了一个 js 库。查看 DateTime 和 Time::Moment 也没有提供解决方案。
【问题讨论】:
我正在尝试将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 所述。
最后一个例子表明不会有任何转换 在没有固定转换率的单位之间。唯一的 可能的转换是:
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
【讨论】:
my $dt1 = DateTime->from_epoch( epoch => 0, time_zone => 'floating'); my $dt2 = $dt1->clone->add_duration($dur); my $secs = $dt2->delta_ms($dt1)->in_units('seconds');