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