Alterar formato de data [duplicado]

0

Dada uma string que contém uma data como substring, como posso converter essa subseqüência de um formato de data para outro? Mais especificamente, tenho as seguintes perguntas:

  1. Como posso converter a sequência de datas "24/10/2017 8:00:00" para a sequência de datas "20171024 8:00:00 AM"?

  2. Como posso converter "Data1 | Data2 | Data3 | 10/24/2017 8:00:00 AM" para "Data1 | Data2 | Data3 | 20171024 8:00:00 AM"?

  3. Se eu tiver um arquivo chamado "Sample.csv" contendo linhas desse formulário (ou seja, dados delimitados por canal), como posso converter a data em cada linha de "Sample.csv" (como na anterior pergunta)?

por John Christian Dela Cruz 07.11.2017 / 02:54

1 resposta

1

Aqui está o comando date que você está procurando:

date -d '${DATE_STRING}' '+%Y%m%d %H:%M:%S %p'

O sinalizador -d (equivalentemente --date ) é usado para especificar uma cadeia que representa a entrada de data / hora. O manual tem isto a dizer sobre isso:

DATE STRING

The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800" or "2004-02-29 16:21:42" or even "next Thursday". A date string may contain items indicating calendar date, time of day, time zone, day of week, relative time, relative date, and numbers. An empty string indicates the beginning of the day. The date string format is more complex than is easily documented here but is fully described in the info documentation.

Com a string de data fornecida em sua postagem, o exemplo acima ficaria assim:

date -d '10/24/2017 8:00:00 AM' '+%Y%m%d %H:%M:%S %p'

Se você quiser extrair a data da string completa no exemplo que você deu, faça o seguinte:

DATE_STRING="Data1|Data2|Data3|10/24/2017 8:00:00 AM"
date -d "$(echo "${DATE_STRING}" | cut -d'|' -f4)" '+%Y%m%d %H:%M:%S %p'

Para alcançar o resultado final desejado para uma única string, você pode fazer algo como o seguinte:

DATE_STRING="Data1|Data2|Data3|10/24/2017 8:00:00 AM"
echo "$(echo "${DATE_STRING}" | cut -d'|' -f1,2,3)|$(date -d "$(echo "${DATE_STRING}" | cut -d'|' -f4)" '+%Y%m%d %H:%M:%S %p')"

E, finalmente, para executar este comando em todas as linhas do arquivo, você poderia fazer algo assim:

while read line; do echo "$(echo "${DATE_STRING}" | cut -d'|' -f1,2,3)|$(date -d "$(echo "${DATE_STRING}" | cut -d'|' -f4)" '+%Y%m%d %H:%M:%S %p')"; done < Sample.csv
    
por 07.11.2017 / 02:59