Fragmentos de timestamp Unix en Perl
Ejemplos de Perl para obtener el timestamp Unix actual con time(), formatear fechas con POSIX::strftime() y convertir fechas de calendario de vuelta a segundos 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;Conceptos básicos de marcas de tiempo en Perl
La función incorporada time() de Perl devuelve la marca de tiempo Unix actual como un número entero de segundos desde la época. Las funciones incorporadas localtime() y gmtime() convierten una marca de tiempo en una lista de valores de calendario (segundo, minuto, hora, día, mes, año, día de la semana, día del año, indicador de DST). El mes de gmtime/localtime empieza en cero (0 = enero) y el año son los años desde 1900.
Formatear y analizar
El módulo POSIX viene con todas las instalaciones estándar de Perl y proporciona strftime(), que formatea una marca de tiempo con los mismos códigos de formato que C. Para precisión por debajo del segundo, Time::HiRes (también en el núcleo desde Perl 5.8) sobrescribe time() y sleep() para que acepten valores en coma flotante. Time::Piece (en el núcleo desde Perl 5.10) añade análisis orientado a objetos mediante strptime().
Notas de producción para Perl
El time() de Perl devuelve un entero nativo, por lo que no está sujeto al desbordamiento del año 2038 en compilaciones de Perl de 64 bits. En compilaciones de Perl de 32 bits, time_t sigue siendo de 32 bits; comprueba $Config{ivsize} del módulo Config. Usa timegm() de Time::Local al construir marcas de tiempo UTC a partir de componentes de calendario, no timelocal(), que interpreta los argumentos como hora local.
- Time::HiRes, POSIX y Time::Local son todos módulos del núcleo y no necesitan instalación
- El argumento de mes para timegm() y timelocal() empieza en cero: pasa 10 para noviembre
- El argumento de año son los años desde 1900: pasa 123 para 2023
- Usa Time::Piece->strptime para analizar cadenas de fecha arbitrarias en lugar de dividir manualmente con regex
FAQ
- ¿Por qué localtime() devuelve una lista en lugar de una cadena?
- En contexto de lista, localtime($ts) devuelve (sec, min, hour, mday, mon, year, wday, yday, isdst). En contexto escalar devuelve una cadena al estilo ctime. Usa POSIX::strftime para producir una cadena con formato personalizado a partir de la lista.
- ¿Cómo obtengo marcas de tiempo de menos de un segundo en Perl?
- Usa Time::HiRes: 'use Time::HiRes qw(time); my $ms = int(time() * 1000);'. El módulo es un módulo del núcleo de Perl, así que no hace falta instalarlo desde CPAN.