Como posso converter uma data com um mês nomeado em um timestamp unix com apenas ferramentas Busybox?

7

Estou trabalhando em um ambiente em que praticamente só tenho acesso a ferramentas busybox e tentando converter uma data no formato Mon Jan 1 23:59:59 2018 GMT em um registro de data e hora unix, em um script de shell. Não consigo alterar o formato do tempo de entrada que estou analisando. Parece que busybox date não consegue entender esse formato de data ou qualquer outro formato com um mês nomeado. Eu tenho um script muito feio que pode fazer isso, mas alguém sabe de algo mais legal?

Editar: a opção date -D não funciona para mim, recebo

date: invalid option -- 'D'     
BusyBox v1.24.1 (2018-01-11 16:07:45 PST) multi-call binary.     

Usage: date [OPTIONS] [+FMT] [TIME]'
    
por Nic 09.02.2018 / 19:22

1 resposta

7

O busybox date 2 é totalmente capaz de analisar a data na string dada com alguma ajuda 1 (exceto para o fuso horário GMT).

$ gdate='Mon Jan 1 23:59:59 2018 GMT'
$ TZ=GMT0 busybox date -d "$gdate" -D '%a %b %d %T %Y %Z'
Mon Jan  1 23:59:59 GMT 2018

A ajuda é dada com a opção -D : uma descrição do formato de origem.

Para obter um timestamp do UNIX, basta adicionar o formato de saída esperado +'%s' :

$  TZ=GMT0 busybox date -d "$gdate" -D '%a %b %d %T %Y %Z' +'%s'
1514851199

1
O busybox date tem a maioria dos recursos do comando GNU date e um que o comando GNU date não: a opção -D . Obtenha a ajuda do busybox da seguinte forma:

$ busybox date --help

BusyBox v1.27.2 (Debian 1:1.27.2-2) multi-call binary.

Usage: date [OPTIONS] [+FMT] [TIME]

Display time (using +FMT), or set time

    [-s,--set] TIME Set time to TIME
    -u,--utc        Work in UTC (don't convert to local time)
    -R,--rfc-2822   Output RFC-2822 compliant date string
    -I[SPEC]        Output ISO-8601 compliant date string
                    SPEC='date' (default) for date only,
                    'hours', 'minutes', or 'seconds' for date and
                    time to the indicated precision
    -r,--reference FILE     Display last modification time of FILE
    -d,--date TIME  Display TIME, not 'now'
    -D FMT          Use FMT for -d TIME conversion

Observe a opção -D FMT .

2
Note que você pode chamar busybox date de duas maneiras:

$ busybox date

Ou, se um link para busybox com o nome date tiver sido instalado no diretório PATH correto:

$ date

Para verificar, basta solicitar --version ou --help para descobrir a data que você instalou.

Com o GNU date :

$ date --version
date (GNU coreutils) 8.28

Ou (busybox date ):

$ date --help
BusyBox v1.27.2 (Debian 1:1.27.2-2) multi-call binary.
…
…
    
por 09.02.2018 / 19:45