Perl-Unix-Timestamp-Snippets
Perl-Beispiele zum Holen des aktuellen Unix-Timestamps mit time(), Formatieren von Daten mit POSIX::strftime() und Rückumwandeln von Kalenderdaten in Epoch-Sekunden mit Time::Local.
my $ts = time();use Time::HiRes qw(time);
my $ms = int(time() * 1000);use POSIX qw(strftime);
my $str = strftime("%Y-%m-%d %H:%M:%S", gmtime(1700000000));
# "2023-11-15 06:13:20"use POSIX qw(strftime);
my $str = strftime("%Y-%m-%d %H:%M:%S", localtime(1700000000));use Time::Local qw(timegm);
# timegm(sec, min, hour, mday, mon, year)
# mon is 0-indexed: 10 = November
my $ts = timegm(20, 13, 6, 15, 10, 2023);use Time::Local qw(timelocal);
my $ts = timelocal(20, 13, 6, 15, 10, 2023);use Time::Piece;
my $t = Time::Piece->strptime("2023-11-15T06:13:20Z", "%Y-%m-%dT%H:%M:%SZ");
my $ts = $t->epoch;Grundlagen zu Perl-Zeitstempeln
Perls eingebaute Funktion time() gibt den aktuellen Unix-Zeitstempel als ganzzahlige Anzahl Sekunden seit der Epoche zurück. Die Built-ins localtime() und gmtime() wandeln einen Zeitstempel in eine Liste von Kalenderwerten um (Sekunde, Minute, Stunde, Tag, Monat, Jahr, Wochentag, Tag des Jahres, DST-Flag). Der Monat aus gmtime/localtime ist 0-indexiert (0 = Januar) und das Jahr ist die Anzahl Jahre seit 1900.
Formatieren und Parsen
Das POSIX-Modul ist in allen Standard-Perl-Installationen enthalten und stellt strftime() bereit, das einen Zeitstempel mit denselben Formatcodes wie C formatiert. Für Sub-Sekunden-Präzision überschreibt Time::HiRes (seit Perl 5.8 ebenfalls im Kern) time() und sleep(), sodass sie Gleitkommawerte akzeptieren. Time::Piece (im Kern seit Perl 5.10) fügt objektorientiertes Parsen über strptime() hinzu.
Hinweise für den Produktiveinsatz von Perl
Perls time() gibt eine native Ganzzahl zurück und ist daher auf 64-Bit-Perl-Builds nicht vom Jahr-2038-Überlauf betroffen. Auf 32-Bit-Perl-Builds ist time_t weiterhin 32-Bit; prüfe $Config{ivsize} aus dem Config-Modul. Verwende timegm() aus Time::Local, wenn du UTC-Zeitstempel aus Kalenderkomponenten erstellst, nicht timelocal(), das die Argumente als lokale Zeit interpretiert.
- Time::HiRes, POSIX und Time::Local sind allesamt Kernmodule und benötigen keine Installation
- Das Monatsargument für timegm() und timelocal() ist 0-indexiert: übergib 10 für November
- Das Jahresargument ist die Anzahl Jahre seit 1900: übergib 123 für 2023
- Verwende Time::Piece->strptime zum Parsen beliebiger Datumsstrings statt manuellem Regex-Splitting
FAQ
- Warum gibt localtime() eine Liste statt eines Strings zurück?
- Im Listenkontext gibt localtime($ts) (sec, min, hour, mday, mon, year, wday, yday, isdst) zurück. Im Skalarkontext gibt es einen String im ctime-Stil zurück. Verwende POSIX::strftime, um aus der Liste einen benutzerdefiniert formatierten String zu erzeugen.
- Wie erhalte ich Sub-Sekunden-Zeitstempel in Perl?
- Verwende Time::HiRes: 'use Time::HiRes qw(time); my $ms = int(time() * 1000);'. Das Modul ist ein Perl-Kernmodul, sodass keine CPAN-Installation nötig ist.