In Perl, wie kann ich parse ein Datum, string und subtrahieren Tagen ab dem Datum es darstellt?
Ich habe ein Datum in string-wie in $str1="20120704"
. Ich möchte subtrahieren 1 Tag, von, Datum, und speichern Sie den Wert des Datums als string in $str2
. Wie kann ich es tun?
InformationsquelleAutor Arav | 2012-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist sehr ähnlich zu einer anderen Frage, die Sie fragte vor ein paar Tagen. Also, nicht überraschend, die Lösung ist auch sehr ähnlich.
Time::Piece und Time::Seconds, Teil der standard-Perl-distribution seit der version 5.10.0. Sie sollten Sie verwenden.
Mit perl 5.8. Werde versuchen, laden Sie die Zeit-Stück-Modul und probieren es aus. Vielen Dank.
PErl 5.8.0 ist zehn Jahre alt. Zeit für eine Aktualisierung!
Vielen Dank. Es funktioniert. Die endgültige Ausgabe Datum ich bin gespeichert, die in der nachstehenden Weise. $outDate=sprintf("%04d%02d%02d", $year2, $month2, $day2); Hoffe es ist richtig.
Sie scheinen die Verwendung von Variablen, die nicht von meinem Beispiel. So ist es schwer zu wissen, ob dein code korrekt ist. Im Allgemeinen mit einem
strftime
Methode wäre vorzuziehen manuell erstellen eine Zeichenfolge mitsprintf
.InformationsquelleAutor Dave Cross
Perl-speichert Datums-und Zeitangaben in einem internen format, können leicht manipuliert werden. Was Sie haben, ist ein Datum im format YYYYMMDD. Also, was Sie tun müssen, ist:
Konvertieren Sie Ihre Datum (im format JJJJMMTT) in Perl-Datum/Uhrzeit-Speicher-format.
Das beste Modul dafür ist Time::Piece kommt mit Perl. Es ist ziemlich einfach:
$date
jetzt Ihr Datum und die Zeit, aber in einem format gespeichert, Perl zu verstehen und zu manipulieren. Die%Y%m%d
ist eine Beschreibung des formats, so dass Perl weiß, wo Sie zu finden können Sie Jahr, Monat und Tag des Monats. Sie können sich strftime zu sehen, die verschiedenen Parameter-format. In deinem Fall:%Y
- stellt das Jahr mit dem Jahrhundert, wie2012
.%m
- Stellt den Monat als zweistellige Zahl, wie03
oder12
.%d
- Stellt den Tag des Monats als zweistellige Zahl, die aus01
zu31
wenn es gibt, die viele Tage im Monat.Weiter: Manipulieren Sie das Datum.
Verwenden Sie ein anderes Modul namens Zeit::Sekunden , erledigen dies für Sie.
Time::Seconds
definiert eine Reihe von Konstanten wieONE_DAY
das macht die Sache einfacher:Schließlich: Konvertieren Sie das Datum wieder auf das format, das Sie möchten.
Wieder
Time::Piece
hat eine nette, einfache Möglichkeit, dies zu tun für Sie:Dieser wandelt
$date
in einen string in Jahr-Monat-Tag-format. Standardmäßig wird ein-
zwischen jedem Teil. Jedoch, Sie kann es passieren, das Zeichen, das Sie verwenden möchten, als die Teiler. In diesem Fall, nichts.Alle zusammen:
Das ist ziemlich einfach.
Dave Cross gab Sie eine ausgezeichnete Antwort. Ich würde in der Regel nur bis wählen ihn, und belassen es dabei. Aber auch er erwähnt Sie gebeten, eine ähnliche Frage vor ein paar Tagen. Für mich bedeutet es, dass Sie möglicherweise verwendet haben, Dave Cross' Vorherige Antwort, aber Sie Verstand es nicht. Das ist nicht gut.
Schauen Sie in die Dokumentation Time::Piece und Zeit::Sekunden. Werfen Sie einen Blick auf strfdate und spielen, um mit. Erlernen und verstehen. Wenn Sie irgendwelche Fragen über diese, Fragen Sie Sie, auf Stackoverflow. Die Menschen auf Stackoverflow sind glücklicher Beantwortung von Fragen wie "Wie funktioniert das?" statt "Können Sie das für mich tun?". Nehmen Sie sich die Zeit und Mühe, um zu erklären, die erste, während die meisten entweder ignorieren Sie die letzteren oder geben Sie eine oberflächliche Antwort.
Dies wird Ihnen einen besseren Programmierer, was bedeutet, du bist mehr Wert mit Ihrem Unternehmen, und das übersetzen in eine höhere Bezahlung. Es ist Wert Ihre Zeit und Mühe.
Versuchen, es zu verstehen. Spielen Sie mit ihm.
Nachtrag
Ist eine ziemlich alte version von Perl, aber es ist üblich, auf Solaris.
In diesem Fall, wir werde es tun, die sehr altmodische Art.
Gibt es zwei Perl-Funktion, die aufgerufen wird localtime und gmtime. Diese nehmen die Anzahl der Sekunden seit dem 1. Januar 1970 und wandeln es in ein Werte-array mit jedem Wert, der einen bestimmten Teil der Zeit (Monat, Jahr, Tag, Stunden, Minuten, etc.).
Was Sie brauchen, sind inverse Funktionen -- etwas, das kann ein array von Werten, und konvertieren Sie es in die Anzahl der Sekunden seit 1970. Seit Perl-3.0, hat es solch ein Modul in der jeweiligen version von Perl. In Perl 5.x, tt genannt Time::Local. Es bietet Ihnen zwei Funktionen genannt
timelocal
undtimegm
. Diese sind die inversen Funktionen, die wir brauchen.Zuerst müssen wir den split den string in einzelne Jahr, Monat, Tag und lege die in einem array entweder
timegm
odertimelocal
um in die Anzahl der Sekunden seit dem 1. Januar 1970.Als Nächstes werden wir subtrahieren Sie die Anzahl der Sekunden eines Tages. Dies ist 60 * 60 * 24 oder 86.400.
Schließlich werden wir zu konvertieren, dass die neue Datum in ein array, das Sie verwenden können, um das Datum in YYYYMMDD um.
Zwei wichtige Vorbehalte!
gmtime
und fügen Sie ein, wenn die Rücknahme vontimegm
.gmtime
, und fügen Sie 1900 an, wenn wir nehmen es wieder austimegm
.Und nun das Programm:
Es gibt eingebauten Perl-Funktionen, kann dies in sehr einfacher Weise, und es gibt Sie in Perl 5.8. Siehe den Nachtrag in meiner Antwort.
Vielen Dank. Es funktioniert. Die endgültige Ausgabe Datum ich bin gespeichert, die in der nachstehenden Weise. $outDate=sprintf("%04d%02d%02d", $year2, $month2, $day2); Hoffe es ist richtig.
Ich fügte hinzu, die Striche in der
printf
, so ist es einfacher zu sehen, was Los ist und wie die Spezifikationen für jeden Teil des Datums durchgeführt werden. Siehe sprintf auf, wie die verschiedenen % die format-codes.Dank David. Deine Antwort hat mir geholfen. Die perl-version in meinem prod linux os ist 5.8.8. Ich kann nicht mit time::piece und haben nicht die Berechtigung zum installieren von Modulen. Ich arbeite auf einer älteren perl-Programm.
InformationsquelleAutor David W.
Berate ich Sie benutzen Modul
DateTime
und ein ext format. Auch können Sie sehen, ModuleDate::Calc
oderDate::Parse
+POSIX
- Funktion strftime.InformationsquelleAutor Pavel Vlasov
Wird dies tun?
Watch out für
localtime
vsgmtime
, und Schaltsekunden, wenn Sie sich über diese.InformationsquelleAutor Bernd Jendrissek
Dies ist eine einfache
strptime
/strftime
hin-und Rückflug. Dastrftime
normalisiert Eingänge ist es einfach nur subtrahieren Sie 1 von der mday Feld.InformationsquelleAutor LeoNerd