Perl Snippets

Extraits de timestamp Unix en Perl

Exemples Perl pour obtenir le timestamp Unix actuel avec time(), formater des dates avec POSIX::strftime() et reconvertir des dates de calendrier en secondes epoch avec Time::Local.

Current Unix timestamp (seconds)
my $ts = time();
Current Unix timestamp (milliseconds)
use Time::HiRes qw(time);
my $ms = int(time() * 1000);
Format timestamp as UTC string
use POSIX qw(strftime);
my $str = strftime("%Y-%m-%d %H:%M:%S", gmtime(1700000000));
# "2023-11-15 06:13:20"
Format timestamp as local time string
use POSIX qw(strftime);
my $str = strftime("%Y-%m-%d %H:%M:%S", localtime(1700000000));
Timestamp from date components (UTC)
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);
Timestamp from date components (local)
use Time::Local qw(timelocal);
my $ts = timelocal(20, 13, 6, 15, 10, 2023);
Parse ISO date string to timestamp
use Time::Piece;
my $t = Time::Piece->strptime("2023-11-15T06:13:20Z", "%Y-%m-%dT%H:%M:%SZ");
my $ts = $t->epoch;

Bases des horodatages en Perl

La fonction intégrée time() de Perl renvoie l'horodatage Unix actuel sous forme d'un nombre entier de secondes depuis l'époque. Les fonctions intégrées localtime() et gmtime() convertissent un horodatage en une liste de valeurs calendaires (seconde, minute, heure, jour, mois, année, jour de la semaine, jour de l'année, indicateur DST). Le mois de gmtime/localtime commence à zéro (0 = janvier) et l'année correspond aux années depuis 1900.

Formater et analyser

Le module POSIX est livré avec toutes les installations Perl standard et fournit strftime(), qui formate un horodatage avec les mêmes codes de format que le C. Pour une précision infra-seconde, Time::HiRes (également dans le noyau depuis Perl 5.8) surcharge time() et sleep() pour accepter des valeurs à virgule flottante. Time::Piece (dans le noyau depuis Perl 5.10) ajoute l'analyse orientée objet via strptime().

Notes de production pour Perl

Le time() de Perl renvoie un entier natif, il n'est donc pas soumis au dépassement de l'an 2038 sur les builds Perl 64 bits. Sur les builds Perl 32 bits, time_t reste sur 32 bits ; vérifiez $Config{ivsize} du module Config. Utilisez timegm() de Time::Local pour construire des horodatages UTC à partir de composants calendaires, pas timelocal(), qui interprète les arguments comme de l'heure locale.

  • Time::HiRes, POSIX et Time::Local sont tous des modules du noyau et ne nécessitent aucune installation
  • L'argument du mois pour timegm() et timelocal() commence à zéro : passez 10 pour novembre
  • L'argument de l'année correspond aux années depuis 1900 : passez 123 pour 2023
  • Utilisez Time::Piece->strptime pour analyser des chaînes de date arbitraires plutôt qu'un découpage manuel par regex

FAQ

Pourquoi localtime() renvoie-t-il une liste plutôt qu'une chaîne ?
En contexte de liste, localtime($ts) renvoie (sec, min, hour, mday, mon, year, wday, yday, isdst). En contexte scalaire, il renvoie une chaîne de style ctime. Utilisez POSIX::strftime pour produire une chaîne formatée personnalisée à partir de la liste.
Comment obtenir des horodatages infrasecondes en Perl ?
Utilisez Time::HiRes : 'use Time::HiRes qw(time); my $ms = int(time() * 1000);'. Le module est un module du cœur de Perl, donc aucune installation CPAN n'est nécessaire.