Converter data para diferente fuso horário + mudança de formato

0

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 preciso converter esse registro de data e hora em timestamp Europa / Helsinque usando o script bash.

Eu tenho este 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 a data "input" format (-d "2015-05-20 18:05:02") é um formato diferente em comparação com o formato de registro de data e hora do meu registro.

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 o $ 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"). / p>

Eu não posso fazer isso funcionar. Alguém pode me ajudar com esse ... 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 seu acaba com erro ..

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

2 respostas

0

Não parece date suporta uma cadeia de formato de entrada. Como tal, você não poderá simplesmente prosseguir e passar a string até a data. A página man afirma que aceita os formatos usuais, então talvez sua configuração de localidade possa influenciar isso, mas não tenho certeza disso.

Ainda mais, 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 parâmetro $1 em um registro de data e hora do Linux e, em seguida, converte-o novamente em uma string desejada. Uma abordagem possível para fazer isso funcionar com sua entrada seria reformatar o parâmetro $1 string.

Você poderia fazer isso como um exemplo usando sed com uma expressão regular adequada. Tenha em atenção que deve certificar-se de que tem uma cadeia válida de antemão e de que quaisquer alterações de formato podem violar esta situação.

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

Editar: não ter os nomes das variáveis erradas certamente ajuda.

    
por 23.09.2016 / 10:07
0

Isso parece um pouco melhor, convertendo o tempo de NZ para o tempo de Mônaco:

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

2017-10-10 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"

Time in Monaco: 2017-10-11 13:56:00

    
por 11.10.2017 / 14:10