ti-enxame.com

Como posso obter uma data formatada para um carimbo de data / hora UNIX na linha de comando

Eu tenho um registro de data e hora do UNIX e gostaria de obter uma data formatada (como a saída de date) correspondente a esse registro de data e hora.

Minhas tentativas até agora:

$ date +%s
1282367908
$ date -d 1282367908
date: invalid date `1282367908'
$ date -d +1282367908
date: invalid date `+1282367908'
$ date +%s -d +1282367908
date: invalid date `+1282367908'

Eu gostaria de conseguir resultados como:

$ TZ=UTC somecommand 1282368345
Sat Aug 21 05:25:45 UTC 2010
63
Umang

No Mac OS X e BSD:

$ date -r 1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -r 1282368345 +%Y-%m-%d
2010-08-21

com GNU (você precisa procurar no arquivo de informações para isso):

$ date -d @1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -d @1282368345 --rfc-3339=date
2010-08-21

Com qualquer um, adicione o -u (padrão) ou passe uma TZ=UTC0 variável de ambiente para ter a data UTC (TZ=UTC0define um fuso horário chamado UTC com deslocamento 0 do UTC enquanto o comportamento para TZ=UTC (sem deslocamento) não é especificado (embora na maioria dos sistemas se refira a um fuso horário definido pelo sistema também chamado UTC com deslocamento 0 do UTC)).

98
user601

Este one-liner Perl fará isso:

$ Perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010
6
AlexD

Depois de pesquisar no Google, encontrei uma maneira de fazer isso apenas com o comando date:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010
6
AlexD

Com os shell integrados:

  • zsh (4.1.1 (2003) e acima):

    $ zmodload zsh/datetime
    $ TZ=UTC0 strftime %c 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    
  • ksh93 (ksh93i (2000) e acima):

    $ TZ=UTC0 printf '%(%c)T\n' '#1282368345'
    Sat Aug 21 05:25:45 2010
    
  • bash (4.2 (2010) e posterior):

    $ TZ=UTC0 printf '%(%c)T\n' 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    

Em todos esses itens, substitua %c Pelo formato strftime() desejado.

5
Stéphane Chazelas

Responda a uma pergunta antiga, mas acho que isso pode ser uma melhoria se alguém procurar por isso. Essa função do Bash funciona no Linux e no OS X. Não testei em nenhum outro sistema BSD. Passe o tempo da época como argumento para esta função e ele imprimirá o formato de tempo RFC-3339.

epochtorfc3339 ()
{
    RFC3339_FORMAT="+%FT%T:::%z"
    Epoch=$(echo [email protected] | sed -n "s/.*\([0-9]\{10\}\).*/\1/p");
    if date --version >/dev/null 2>/dev/null; then
        # Linux
        date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${Epoch} seconds"
        #date -d @${Epoch} --rfc-3339=seconds
    else
        # OS X/BSD
        date -r ${Epoch} ${RFC3339_FORMAT}
    fi
}
2
Noah Spurrier

No osx, para ter no UTC

date -r "1475737200" -u
2
anyone

Outro exemplo interessante da rica herança do Unix moderno. Isso é realmente possível na maioria das variantes do BSD:

$ TZ=UTC date -r 1282368345
Sat Aug 21 05:25:45 UTC 2010

(BTW, seu exemplo parece estar errado em um segundo)

1
codehead