Frammenti di timestamp Unix in Perl
Esempi Perl per ottenere il timestamp Unix attuale con time(), formattare date con POSIX::strftime() e riconvertire date di calendario in secondi epoch con 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;Basi dei timestamp in Perl
La funzione integrata time() di Perl restituisce il timestamp Unix corrente come numero intero di secondi dall'epoca. Le funzioni integrate localtime() e gmtime() convertono un timestamp in una lista di valori di calendario (secondo, minuto, ora, giorno, mese, anno, giorno della settimana, giorno dell'anno, flag DST). Il mese da gmtime/localtime parte da zero (0 = gennaio) e l'anno è il numero di anni dal 1900.
Formattare e analizzare
Il modulo POSIX è incluso in tutte le installazioni standard di Perl e fornisce strftime(), che formatta un timestamp con gli stessi codici di formato del C. Per la precisione sotto il secondo, Time::HiRes (anch'esso nel core da Perl 5.8) ridefinisce time() e sleep() per accettare valori in virgola mobile. Time::Piece (nel core da Perl 5.10) aggiunge l'analisi orientata agli oggetti tramite strptime().
Note di produzione per Perl
Il time() di Perl restituisce un intero nativo, quindi non è soggetto all'overflow dell'anno 2038 nelle build Perl a 64 bit. Nelle build Perl a 32 bit, time_t è ancora a 32 bit; controlla $Config{ivsize} dal modulo Config. Usa timegm() di Time::Local quando costruisci timestamp UTC dai componenti di calendario, non timelocal(), che interpreta gli argomenti come ora locale.
- Time::HiRes, POSIX e Time::Local sono tutti moduli core e non richiedono installazione
- L'argomento del mese per timegm() e timelocal() parte da zero: passa 10 per novembre
- L'argomento dell'anno è il numero di anni dal 1900: passa 123 per il 2023
- Usa Time::Piece->strptime per analizzare stringhe di data arbitrarie invece dello split manuale con regex
FAQ
- Perché localtime() restituisce una lista invece di una stringa?
- In contesto di lista, localtime($ts) restituisce (sec, min, hour, mday, mon, year, wday, yday, isdst). In contesto scalare restituisce una stringa in stile ctime. Usa POSIX::strftime per produrre una stringa formattata personalizzata dalla lista.
- Come ottengo timestamp sotto il secondo in Perl?
- Usa Time::HiRes: 'use Time::HiRes qw(time); my $ms = int(time() * 1000);'. Il modulo è un modulo core di Perl, quindi non serve installarlo da CPAN.