2017-10-26 26 views
3

ISO 8601時間の長さの形式P3Y6M4DT12H30M5Sをperl単位で秒に変換しようとしています。これを行うライブラリはありますか?私は検索しようとしましたが、私はjsライブラリしか見つけませんでした。 DateTimeとTime :: Momentを見ても解決策はありませんでした。perlでISO8601の継続時間(P3Y6M ...)を秒に変換する

答えて

6

DateTime::Format::Duration::ISO8601があり、ISO 8601の継続時間文字列をDateTime::Durationオブジェクトに変換できます。それを秒に変換することができます。 in the docs hereを説明するように

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

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

ただし、日時::継続時間形式は、秒に一年変換するために使用することはできません。

最後の例は、固定変換レートを持たない単位間に変換 が存在しないことを示しています。可能性のみ 変換は、次のとおりです。このようなケースである理由の説明については

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

、あなたがに%spatternDateTime::Format::Durationを使用することができますDateTime.pmドキュメントのHow DateTime Math Worksセクション

を参照してください。それを回避する。完全な実装は、次のようになります。

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); 

または、要するに1回だけ必要な場合は短くしてください。

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 
+2

再それができる、「*ただし、日時::継続形式は*秒に一年変換するために使用することはできません」と表示します。ただ簡単にはありません。これはそれを行うべきです: 'my $ dt1 = DateTime-> from_epoch(epoch => 0、time_zone => 'floating');私の$ dt2 = $ dt1->クローン - > add_duration($ dur); my $ secs = $ dt2-> delta_ms($ dt1) - > in_units( '秒'); ' – ikegami

関連する問題