Como posso obter uma data formatada para um timestamp UNIX a partir da linha de comando

46

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

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'

Gostaria de obter resultados como:

$ TZ=UTC somecommand 1282368345
Sat Aug 21 05:25:45 UTC 2010
    
por Umang 21.08.2010 / 07:27

7 respostas

78

No Mac OS X e no BSD:

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

com ferramentas básicas GNU (você tem que cavar através do arquivo info para isso):

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

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

    
por 21.08.2010 / 09:26
6

Este perl one-liner fará isso:

$ perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010
    
por 21.08.2010 / 08:01
5

Depois de algum googling, 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
    
por 21.08.2010 / 08:07
4

Com builtins de shell:

  • 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 acima):

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

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

    
por 06.10.2016 / 23:37
1

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

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

(BTW, o seu exemplo parece estar desativado em um segundo)

    
por 21.08.2010 / 09:20
1

Responda a uma pergunta antiga, mas acho que isso pode ser uma melhoria se alguém mais pesquisar isso. Esta função Bash funciona tanto no Linux quanto no OS X. Eu não testei em nenhum outro sistema BSD. Passe o tempo da época como um argumento para essa função e ele imprimirá o formato de hora RFC-3339.

epochtorfc3339 ()
{
    RFC3339_FORMAT="+%FT%T:::%z"
    EPOCH=$(echo $@ | sed -n "s/.*\([0-9]\{10\}\).*//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
}
    
por 13.10.2015 / 23:20
1

Em osx, para ter em UTC

date -r "1475737200" -u
    
por 06.10.2016 / 23:20