Datum in andere Zeitzone konvertieren + Format ändern

Datum in andere Zeitzone konvertieren + Format ändern

Ich habe eine Protokolldatei mit Zeitstempeln im Format „22.09.2016 08:22:54“ („+%Y:%m:%d %H:%M:%S“). Dieser Zeitstempel ist in der Zeitzone UTC.

Jetzt muss ich diesen Zeitstempel mithilfe eines Bash-Skripts in den Zeitstempel Europa/Helsinki konvertieren.

Ich habe dieses Skript, das die Konvertierung wie gewünscht durchführt.

#!/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"

Dies funktioniert einwandfrei, aber das Datumseingabeformat (-d „2015-05-20 18:05:02“) unterscheidet sich vom Format meines Protokollzeitstempels.

Ich möchte dieses Skript etwa so ändern...

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

Wobei das $1 im originalen Datumsformat meiner Logdatei "22.09.2016 08:22:54" ("+%Y:%m:%d %H:%M:%S") stehen kann.

Ich bekomme das nicht zum Laufen. Kann mir jemand dabei helfen? Danke

BEARBEITEN:

Ich habe so etwas und viele andere Kombinationen ausprobiert.

#!/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" 

aber es endet mit einem Fehler.

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

Antwort1

Es sieht nicht so ausdateunterstützt eine Eingabeformatzeichenfolge. Daher können Sie die Zeichenfolge nicht einfach an date übergeben. Auf der Manpage steht, dass die üblichen Formate akzeptiert werden. Vielleicht könnte Ihre Gebietsschemaeinstellung dies beeinflussen, aber da bin ich mir nicht sicher.

Schauen wir uns außerdem Ihr Skript an:

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

Dabei konvertieren Sie den $1Parameter in einen Linux-Zeitstempel und ihn dann erneut in die gewünschte Zeichenfolge. Ein möglicher Ansatz, um dies mit Ihrer Eingabe zu erreichen, wäre, den $1Zeichenfolgenparameter neu zu formatieren.

Sie können dies beispielsweise sedmit einem geeigneten regulären Ausdruck tun. Beachten Sie, dass Sie vorher sicherstellen sollten, dass Sie eine gültige Zeichenfolge haben und dass Formatänderungen diese beschädigen könnten.

#!/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")

Bearbeiten: Es hilft sicherlich, keine falschen Variablennamen zu haben.

Antwort2

So sieht es etwas besser aus, wenn man die neuseeländische Zeit in die Zeit von Monaco umrechnet:

TZ="Europa/Monaco" Datum --Datum="TZ=\"Pazifik/Auckland\" 2017-10-11 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"

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

Antwort3

Unter MacOS (10.14.3) funktioniert es ziemlich gut, da Sie Ihr genaues Format über -feinen Schalter angeben können:

$ 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

und übrigens, Ihr Protokollformat ist "+%d.%m.%Y %H:%M:%S", nicht "+%Y:%m:%d %H:%M:%S"wie Sie es nach dem zweiten Codeausschnitt angeben, sonst secwürde die Zeile, in der in meinem obigen Code definiert ist, wahrscheinlich illegal time formateinen Fehler oder etwas in der Art auslösen.

verwandte Informationen