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.
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;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.