Extrai data de uma variável em um formato diferente

6

Deixe-me explicar-lhe o problema

$ date +%c -d "$d"
Tue 31 Dec 2013 01:13:06 PM CET
$ date +'Today is %F' -d "$d"
Today is 2013-12-31

Esta solução corresponde à data atual.

Mas tenho uma variável que armazena a data diferente da data atual

$Prev_date="Wed Dec 25 06:35:02 EST 2013" 

Estou procurando uma solução para ler essa data como 2013-12-25 e armazená-la em uma variável.

Eu tentei isso:

a='date --date=$Prev_date '+%y/%m/d''
echo $a

Está dando este erro:

date: illegal option -- date=Wed
usage: date [-u] mmddHHMM[[cc]yy][.SS]
date [-u] [+format]
date -a [-]sss[.fff]
    
por Prabhat 31.12.2013 / 16:22

6 respostas

4

A opção -d é específica do GNU.

Aqui, você não precisa fazer o cálculo da data, basta reescrever a string que já contém todas as informações:

a=$(printf '%s\n' "$Prev_date" | awk '{
  printf "%04d-%02d-%02d\n", $6, \
  (index("JanFebMarAprMayJunJulAugSepOctNovDec",$2)+2)/3,$3}')
    
por 31.12.2013 / 16:59
7

Eu suponho que você esteja falando sobre o Bash. Em caso afirmativo, você está perdendo o " em torno dos argumentos do parâmetro --date .

Em vez de

a='date --date=$Prev_date '+%y/%m/d''

tente isso

a='date --date="$Prev_date" '+%y/%m/d''

e estou supondo que o d deve ter um % . Então seria assim:

a='date --date="$Prev_date" '+%y/%m/%d''

As razões pelas quais seu erro mostrou o uso do comando date é o seguinte:

Sem o " em torno de $Prev_date , a variável será substituída e o comando ficará assim:

a='date --date=Wed Dec 25 06:35:02 EST 2013 '+%y/%m/d''

Portanto, somente o Wed é considerado como argumento para --date , enquanto todas as outras partes da string $Prev_date são consideradas parâmetros separados para o comando date. Então date diz que não conhece um parâmetro chamado Dec e mostra que é a saída de ajuda.

    
por 31.12.2013 / 16:25
2

Se bem entendi, você deseja salvar a data para poder reutilizá-la mais tarde para imprimir a mesma data em diferentes formatos. Para isso, proponho salvar a data em um formato que possa ser facilmente analisado pelo comando date -d e permitir que o comando date faça a formatação.

Tanto quanto sei, o formato +%Y%m%d %H:%M:%S é o mais independente da plataforma. Então, vamos salvar a data neste formato:

d=$(date '+%Y%m%d %H:%M:%S')

Em seguida, você pode imprimir essa data em diferentes formatos, por exemplo:

$ date +%c -d "$d"
Tue 31 Dec 2013 01:13:06 PM CET
$ date +'Today is %A' -d "$d"
Today is Tuesday
$ date +'Today is %F' -d "$d"
Today is 2013-12-31

UPDATE

Se você receber uma string de data como Wed Dec 25 06:35:02 EST 2013 , poderá tentar analisá-la com date -d e alterar seu formato, por exemplo:

$ date +%F -d 'Wed Dec 25 06:35:02 EST 2013'
2013-12-25

Isso funciona com a data do GNU. Se não funcionar no seu sistema, você pode tentar o comando gdate , geralmente ele existe em sistemas modernos.

    
por 31.12.2013 / 13:15
1

Parece que a primeira saída é G. C já contém a primeira palavra da data real (Tue), então quando você tenta executar

'tue …format… '

seu shell responde que tue não é um comando válido.

$ A=date
$ echo $($A)
Mar 31 déc 2013 12:21:48 CET
$ B=$($A)   
$ echo $B
Mar 31 déc 2013 12:22:12 CET

Tente apenas armazenar a data na variável C , como fiz com A .

E, a propósito, você não consegue encontrar nomes melhores para eles?

    
por 31.12.2013 / 12:24
1

Como outros apontaram, o problema é que a data armazenada em $C acima está sendo avaliada antes de ser passada para sua subshell (pelo uso de ''), então a subshell está tentando encontrar um comando literal chamado 'Tue' (ou seja, o início da sua string de data).

Para corrigir isso, você precisará passar o comando date de volta para uma versão GNU de date usando a opção -d , que terá uma data existente como entrada.

Eu ilustrei isso usando seu código de exemplo acima:

C=$(date)
G=$(gdate '+%Y%m%d' -d "$C")

echo "C = $C"
echo "G = $G"

Quais saídas

C = Tue Dec 31 10:33:29 EST 2013
G = 20131231

Observação: eu tive que usar gdate para fazer isso funcionar no meu sistema (OS X).

Se você não tiver um comando date compatível com GNU e não puder instalá-lo por qualquer motivo, o melhor que você poderia fazer seria manipular diretamente a string de data, usando algo como isto:

C=$(date)
D=$(echo "$C" | awk -F' ' '{ printf "%s-%s-%s", $6, $2, $3 }')

echo "C = $C"
echo "D = $D"

, que produz a seguinte saída:

C = Tue Dec 31 12:03:27 EST 2013
D = 2013-Dec-31
    
por 31.12.2013 / 16:38
0

No Mac OS X usando o comando FreeBSD date , você pode fazer a transformação através do tempo de época:

epoch_time="$(LANG=C TZ='EST' date -j -f "%a %b %d %T %Z %Y" "Wed Dec 25 06:35:02 EST 2013" "+%s")"
a="$(date -r $epoch_time '+%F')
echo "$a"  #  2013-12-25
    
por 21.11.2014 / 13:04