Perl Snippets

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.

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;

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.