Converter data em fuso horário diferente + alteração de formato

Converter data em fuso horário diferente + alteração de formato

Eu tenho um arquivo de log com carimbos de data e hora no formato "22.09.2016 08:22:54" ("+%Y:%m:%d %H:%M:%S"). Este carimbo de data/hora está no fuso horário UTC.

Agora tenho que converter esse carimbo de data/hora para o carimbo de data/hora da Europa/Helsinque usando o script bash.

Tenho esse script que faz a conversão como eu quero.

#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "2015-05-20 18:05:02")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"

Isso funciona bem, mas o formato de "entrada" da data ( -d "2015-05-20 18:05:02" ) é um formato diferente em comparação com o formato de carimbo de data / hora do meu log.

Eu gostaria de mudar este script para algo assim.

#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "$1")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"

Onde $1 pode estar no formato de data original do meu arquivo de log "22.09.2016 08:22:54" ("+%Y:%m:%d %H:%M:%S").

Não consigo fazer isso funcionar.. Alguém pode me ajudar com isso.. Obrigado

EDITAR:

Eu tentei algo assim e muitas outras combinações.

#!/bin/sh 
sec=$(TZ="UTC" date +'%s' "+%Y:%m:%d %H:%M:%S" -d "$1") 
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S" 

mas o dele acaba com erro..

date: extra operand ‘+%Y:%m:%d %H:%M:%S’ 
Try 'date --help' for more information. 
date: invalid date ‘@’ 

Responder1

Não parecedatesuporta uma string de formato de entrada. Como tal, você não poderá simplesmente seguir em frente e passar a string até o momento. A página de manual afirma que aceita os formatos usuais, então talvez sua configuração de localidade possa influenciar isso, mas não tenho certeza sobre isso.

Além disso, vamos dar uma olhada no seu script:

#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "$1")
$(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S")

O que acontece aqui é que você converte o $1parâmetro em um carimbo de data/hora do Linux e depois o converte novamente na string desejada. Uma abordagem possível para fazer isso funcionar com sua entrada seria reformatar o $1parâmetro string.

Você poderia fazer isso como exemplo usando sedum regex adequado. Tenha em atenção que deve certificar-se de que possui uma string válida de antemão e que qualquer alteração de formato poderá quebrá-la.

#!/bin/bash
intputdate=$(echo $1 | sed -re 's/([0-9]{2})\.([0-9]{2})\.([0-9]{4})/\3-\2-\1/')
sec=$(TZ="UTC" date +'%s' -d "$intputdate")
echo $(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S")

Editar: não ter nomes de variáveis ​​errados certamente ajuda.

Responder2

Isso parece um pouco melhor, convertendo o horário da Nova Zelândia para o horário de Mônaco:

TZ="Europa/Mônaco" data --date="TZ=\"Pacífico/Auckland\" 11/10/2017 00:51" +%Y-%m-%d\ %H:%M:%S

10/10/2017 13:51:00

#!/bin/bash
new_zealand_time="2017-10-12 00:56"
monaco_time=$(TZ="Europe/Monaco" date --date="TZ=\"Pacific/Auckland\" $new_zealand_time" +%Y-%m-%d\ %H:%M:%S)
echo "Time in Monaco: $monaco_time"

Horário em Mônaco: 11/10/2017 13:56:00

Responder3

No MacOS (10.14.3) funciona muito bem, pois você pode fornecer seu formato exato por meio -fdo switch:

$ d1="22.09.2016 08:22:54"
$ sec=$(TZ="UTC" date -j -f "%d.%m.%Y %H:%M:%S" "$d1" "+%s")
1474532574
$ TZ="Europe/Helsinki" date -j -f "%s" "$sec" "+%Y:%m:%d %H:%M:%S"
2016:09:22 11:22:54

e, a propósito, seu formato de log é "+%d.%m.%Y %H:%M:%S", não "+%Y:%m:%d %H:%M:%S"como você afirma após o segundo trecho de código, caso contrário, a linha secdefinida em meu código acima provavelmente gerará illegal time formatum erro ou algo parecido.

informação relacionada