Como converter de um formato de data para outro formato?

11

Eu tenho um problema com meu formato de data. Quero mudar de um formato para outro e vice-versa. Meus formatos de data são

Formato 1

YYYY-MM-DD

Formato 2

MM/DD/YYYY

Quero alterar o formato 1 para o formato 2 e o formato 2 para o formato 1.

AiB
fonte
Para ser mais claro, tenho o arquivo file1 name: date 2000-01-01 2000-01-02 2000-01-03 2000-01-04. A saída necessária é 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 e vice-versal
AiB 05/09
Forward-barras são um dos apenas dois personagens que não pode estar em um nome de arquivo * nix ...
evilsoup

Respostas:

14

Use a 'data' do GNU para isso. Também converterá entre outros formatos para você (veja date --helpa lista de formatos).

$ date -d 2013-07-05 +%m/%d/%Y
07/05/2013
$ date -d 07/05/2013 +%F
2013-07-05
Stéphane Chazelas
fonte
para ser mais claro, tenho o arquivo file1 name: date 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. A saída necessária é 01 / 01.2000 01/02/2000 01/03 / 2000 02/02/2000 e vice-versal
AiB 05/09
1
@Abraham, como isso não atende a esse requisito?
jordanm
6

Supondo que você tenha datas em formato de texto que precisam ser convertidas

echo '2013-12-13' | awk -v FS=- -v OFS=/ '{print $2,$3,$1}'

E vice versa

echo '12/13/2013' | awk -v FS=/ -v OFS=- '{print $3,$1,$2}'
iruvar
fonte
para ser mais claro, tenho o arquivo file1 name: date 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. A saída necessária é 01 / 01.2000 01/02/2000 01/03 / 2000 02/02/2000 e vice-versal
AiB 05/09
Obrigado 1_CR, Está funcionando agora depois que eu modifiquei um pouco !! #! / bin / bash echo '$ 1- $ 2- $ 3' | awk -v FS = - -v OFS = / '{print $ 2, $ 3, $ 1}' data.file
AiB
@Abraham, você deve tentar a sua sorte com das drewbenn dateabordagem, que é certamente mais elegante
Iruvar
3
$ echo YYYY-MM-DD | { IFS=- read y m d && echo "$m/$d/$y"; }
MM/DD/YYYY

Se você tiver um arquivo com muitas dessas datas, uma por linha:

awk -F- -vOFS=/ '{print $2,$3,$1}' < that-file
Stéphane Chazelas
fonte
0

Usando sed da seguinte maneira:

$ echo '2013-12-13' | sed -r 's/([[:digit:]]{2,4})-([[:digit:]]{1,2})-([[:digit:]]{1,2})/\2\/\3\/\1/g'
12/13/2013
$ echo '12/13/2013' | sed -r 's/([[:digit:]]{1,2})\/([[:digit:]]{1,2})\/([[:digit:]]{2,4})/\3-\1-\2/g'
2013-12-13
mark_infinite
fonte
0

Respondendo à pergunta esclarecida nos comentários sobre como alterar o formato da data em um nome de arquivo, use uma variante da gnu dateabordagem de drewbenn . Este comando localiza todos os arquivos na pasta local e canaliza apenas o nome do arquivo xargs, substituindo o datenome do arquivo modificado como o segundo argumento ao mvqual a renomeação é executada.

O uso adicional e ligeiramente tortuoso da bashsubstituição de variáveis ​​é necessário ao bashavaliar o datecomando.

find ./ -printf '%f\n' | xargs -I '{}' sh -c 'mv $1  $(date -j -f %Y-%m-%d $1 +%m/%d%Y)' -- {} \;
Roubar
fonte