Wie machen DateTime::Duration Ausgabe nur in Tagen?
Dieser code findet den Unterschied zwischen heute und einem bestimmten Datum.
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use DateTime ();
use DateTime::Duration ();
use DateTime::Format::Strptime ();
my $date = "23/05-2022";
my $parser = DateTime::Format::Strptime->new(
pattern => '%d/%m-%Y',
time_zone => 'local',
);
$date = $parser->parse_datetime($date);
my $today = DateTime->today(time_zone=>'local');
my $d = DateTime::Duration->new($today - $date);
print Dumper $d->delta_days;
Das problem ist, dass nur Ausgänge -22 Tage.
Wenn ich print Dumper $d;
ich sehe das -130 Monaten.
$VAR1 = bless( {
'seconds' => 0,
'minutes' => 0,
'end_of_month' => 'preserve',
'nanoseconds' => 0,
'days' => -22,
'months' => -130
}, 'DateTime::Duration' );
Wie bekomme ich es auf das Ergebnis in Tagen?
Tun
print Dumper $d->delta_days + $d->delta_months*30;
nicht die Naht wie eine elegante Lösung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst müssen Sie die richtige Subtraktion. Es gibt
delta_md
,delta_days
,delta_ms
undsubtract_datetime_absolute
. Je nachdem, welche Einheit, die Sie später wollen, müssen Sie wählen Sie die richtige Subtraktion. Das problem ist, dass nicht jede Einheit Cabrio später ohne time_zone Informationen. Das ist der Grund, warum Sie benötigen, um wählen Sie die richtige delta-Methode.Beispielsweise eine Tag 23 Stunden oder 24 oder 25 Stunden, je nach Zeitzone. Weil das so ist, müssen Sie angeben, wie die Subtraktion funktionieren sollte. Weil Sie wollen, dass die Tage später die Subtraktion brauchen, um konzentrieren sich auf Tage, sondern konzentrieren sich auf Stunden. Verwenden Sie nicht die überlast-feature, denn es macht nur eine beste Passform.
Das bedeutet, dass Sie tun müssen, um eine
delta_days
Subtraktion.Nun $dur ist eine
DateTime::Duration
Objekt. Benötigen Sie wusste, dass er immer versucht, die am besten passen, die Tage, Wochen, Jahre, Monate, wenn möglich. Das bedeutet, dass Ihre Tage aufgeteilt werden in Wochen und Tagen. Weil diese Konvertierung ist immer eine Konstante.Wenn Sie nicht möchten, dass diese "best-fit" müssen Sie rufen Sie die
in_units
Methode und wandeln es nur um Tage.Aber wie ich schon sagte, bevor
in_units
nur eine Umwandlung, wo es möglich ist. Ein Anruf mitin_units('hours')
wird nicht auf dieses Objekt zurückzugeben und nur eine null, weil Sie nicht konvertieren von Tagen auf Stunden. Wenn Sie möchten, Stunden zum Beispiel, müssen Sie einendelta_ms
, und auf diesem Objekt aufrufen können Siein_units('hours')
Das komplette Beispiel:
Die Ausgabe dieses Programms ist:
Und nur zur info:
1) Sie brauchen nicht zu laden
DateTime::Duration
seine geladen mitDateTime
.2) brauchen Sie nicht (). Diese Module sind OOP und nicht exportieren/importieren nichts.
()
imuse
Aussagen sowieso. Nur weil ein Modul ist OO bedeutet nicht, dass es keine Exporte. Wenn Sie()
Sie wissen es ist nicht alles exportieren in das Skript (ohne auch nur einen Blick auf das Modul).$dur->in_units('days')
. Ist es möglich, signierte Anzahl von Tagen?Von einem schnellen Lesen der DateTime-Modul doc, ich glaube nicht, dass
wird tun, was Sie erwarten. Ich glaube, Sie brauchen, um zu verwenden
Den Typ der
$dur
ist nicht sofort klar die docs jedoch nicht.subtract_datetime()
ist für den Zweck gemacht, so werde ich es auch benutzen.