2017-10-26 4 views

Antwort

6

Es gibt DateTime::Format::Duration::ISO8601, die die ISO 8601-Dauer Zeichenfolge in ein DateTime::Duration Objekt konvertieren können. Sie können das dann in Sekunden umwandeln.

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

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

jedoch die Datetime :: Dauer Format kann nicht ein Jahr auf Sekunden zu konvertieren verwendet werden, wie in the docs here erläutert.

Das letzte Beispiel zeigt, dass es keine Konvertierung zwischen Einheiten gibt, die keine feste Umwandlungsrate haben. Die einzigen Konvertierungen möglich sind:

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

Für die Erklärung, warum dies der Fall ist, finden Sie in der How DateTime Math Works Abschnitt der DateTime.pm Dokumentation

Sie DateTime::Format::Duration mit dem %s können sehen pattern zu Umgehe das. Eine vollständige Implementierung könnte so aussehen.

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

Oder, kurz gesagt, wenn Sie es nur einmal brauchen.

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

Beide werden

109254605 
+2

Re drucken „* Doch die Datetime :: Dauer Format nicht verwendet werden kann, ein Jahr Sekunden * zu konvertieren“, Es kann; einfach nicht leicht. Das sollte es tun: 'my $ dt1 = DateTime-> from_epoch (epoch => 0, time_zone => 'floating'); mein $ dt2 = $ dt1-> klon-> add_duration ($ dur); meine $ secs = $ dt2-> delta_ms ($ dt1) -> in_units ('sekunden'); ' – ikegami

Verwandte Themen