Perl Snippets

Trechos de timestamp Unix em Perl

Exemplos de Perl para obter o timestamp Unix atual com time(), formatar datas com POSIX::strftime() e converter datas de calendário de volta para segundos epoch com 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;

Noções básicas de marcas de tempo em Perl

A função interna time() do Perl retorna a marca de tempo Unix atual como um número inteiro de segundos desde a época. As funções internas localtime() e gmtime() convertem uma marca de tempo em uma lista de valores de calendário (segundo, minuto, hora, dia, mês, ano, dia da semana, dia do ano, indicador de DST). O mês de gmtime/localtime começa em zero (0 = janeiro) e o ano são os anos desde 1900.

Formatar e analisar

O módulo POSIX vem com todas as instalações padrão do Perl e fornece strftime(), que formata uma marca de tempo com os mesmos códigos de formato do C. Para precisão abaixo do segundo, o Time::HiRes (também no núcleo desde o Perl 5.8) sobrescreve time() e sleep() para aceitar valores de ponto flutuante. O Time::Piece (no núcleo desde o Perl 5.10) adiciona análise orientada a objetos via strptime().

Notas de produção para Perl

O time() do Perl retorna um inteiro nativo, então não está sujeito ao estouro do ano 2038 em builds de Perl de 64 bits. Em builds de Perl de 32 bits, time_t ainda é de 32 bits; verifique $Config{ivsize} do módulo Config. Use timegm() do Time::Local ao construir marcas de tempo UTC a partir de componentes de calendário, não timelocal(), que interpreta os argumentos como hora local.

  • Time::HiRes, POSIX e Time::Local são todos módulos do núcleo e não precisam de instalação
  • O argumento de mês para timegm() e timelocal() começa em zero: passe 10 para novembro
  • O argumento de ano são os anos desde 1900: passe 123 para 2023
  • Use Time::Piece->strptime para analisar strings de data arbitrárias em vez de dividir manualmente com regex

FAQ

Por que localtime() retorna uma lista em vez de uma string?
Em contexto de lista, localtime($ts) retorna (sec, min, hour, mday, mon, year, wday, yday, isdst). Em contexto escalar, retorna uma string no estilo ctime. Use POSIX::strftime para produzir uma string com formatação personalizada a partir da lista.
Como obtenho marcas de tempo de subsegundo em Perl?
Use Time::HiRes: 'use Time::HiRes qw(time); my $ms = int(time() * 1000);'. O módulo é um módulo do núcleo do Perl, então não é preciso instalar do CPAN.