Como posso converter uma data e hora local em data e hora UTC?

2

Eu estou tentando obter um script bash trabalhando e para fazer isso eu preciso transformar um horário local em +%Y%m%d%H%M%S format (exemplo: "20150903170731") em hora UTC no mesmo formato.

Eu sei que date -u pode me informar o horário UTC atual:

$ date +%Y%m%d%H%M%S  -u
20150903161322

Ou, sem o -u da hora local (aqui, BST):

$ date +%Y%m%d%H%M%S
20150903171322

Agora, se eu adicionar um argumento a date , recebo um erro:

echo "20150903154607" | xargs date +"%Y%m%d%H%M%S" -u
date: extra operand '20150903154607'

Existe alguma maneira de realizar essa conversão sem esses erros?

    
por Franco 03.09.2015 / 18:21

1 resposta

6

Para passar uma data para usar em date , use a opção -d . Então, seu comando ficaria parecido com echo "20150903154607" | xargs date +"%Y%m%d%H%M%S" -u -d .

No entanto, não é preciso exatamente o formato de data que você está fornecendo:

$ date -d 20150903154607
date: invalid date ‘20150903154607’
$ date -d 20150903\ 15:46:07
Thu Sep  3 15:46:07 BST 2015

Então massageie um pouco primeiro (GNU sed):

$ echo "20150903154607" \
   | sed -re 's/^([0-9]{8})([0-9]{2})([0-9]{2})([0-9]{2})$/\ ::/' \
   | xargs date -u -d
Thu Sep  3 15:46:07 UTC 2015

Para converter de local para UTC, você precisa fazer um pouco mais, porque -u afeta a interpretação das datas de entrada e saída:

$ echo "20150903171734" \
   | sed -re 's/^([0-9]{8})([0-9]{2})([0-9]{2})([0-9]{2})$/\ ::/' \
   | xargs date +@%s -d \
   | xargs date -u +%Y%m%d%H%M%S -d
20150903161734

A primeira invocação de date acima converte a hora local (de acordo com $TZ ) em segundos desde a época; o segundo converte os segundos-epoch na data e hora UTC.

    
por 03.09.2015 / 18:54

Tags