Konwertuj datę na inną strefę czasową + zmianę formatu

0

Mam plik dziennika ze znacznikami czasu w formacie „22.09.2016 08:22:54” („+% Y:% m:% d% H:% M:% S”). Ten znacznik czasu znajduje się w strefie czasowej UTC.

Teraz muszę przekonwertować ten znacznik czasu na znacznik czasu Europa / Helsinki za pomocą skryptu bash.

Mam ten skrypt, który czyni konwersję tak, jak chcę.

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

Działa to dobrze, ale format „data” „-d” 2015-05-20 18:05:02 ”jest innym formatem w porównaniu z formatem datownika dziennika.

Chciałbym zmienić ten skrypt na coś podobnego ..

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

Gdzie $ 1 może być w oryginalnym formacie daty mojego pliku dziennika "22.09.2016 08:22:54" ("+% Y:% m:% d% H:% M:% S").

Nie mogę tego zrobić. Czy ktoś może mi pomóc z tym .. Dziękuję

EDYTOWAĆ:

Próbowałem czegoś takiego i wielu innych kombinacji ..

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

ale jego błąd kończy się

date: extra operand ‘+%Y:%m:%d %H:%M:%S’ 
Try 'date --help' for more information. 
date: invalid date ‘@’ 
user3647376
źródło
Czy próbowałeś ustawić format pierwszej linii?
Seth
tak .. Próbowałem tego .. #! / bin / sh sec = $ (TZ = data "UTC" + '% s' "+% Y:% m:% d% H:% M:% S" - d „$ 1”) TZ = „Europa / Helsinki” data -d „@ $ sec” „+% Y:% m:% d% H:% M:% S”, ale kończy się błędem .. data: extra operand '+% Y:% m:% d% H:% M:% S' Spróbuj 'date --help', aby uzyskać więcej informacji. data: nieprawidłowa data „@”
user3647376

Odpowiedzi:

0

To nie wygląda date obsługuje ciąg formatów wejściowych. Jako taki nie będziesz w stanie po prostu iść dalej i przekazać do tej pory łańcucha. Strona man stwierdza, że ​​akceptuje zwykłe formaty, więc może to mieć wpływ na ustawienia regionalne, ale nie jestem tego pewien.

Co więcej, spójrzmy na swój skrypt:

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

Dzieje się tak dlatego, że konwertujesz $1 parametr do znacznika czasu Linuksa, a następnie przekonwertuj go ponownie na żądany ciąg. Jednym z możliwych podejść do tej pracy z twoim wejściem byłoby ponowne sformatowanie $1 parametr string.

Możesz to zrobić jako przykład, używając sed z odpowiednim wyrażeniem regularnym. Uważaj, abyś wcześniej upewnił się, że masz poprawny łańcuch i że wszelkie zmiany formatu mogą go przerwać.

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

Edycja: Niewłaściwe nazwy zmiennych na pewno pomagają.

Seth
źródło
0

Wygląda to trochę ładniej, zamieniając czas NZ na czas Monaco:

TZ = „Europe / Monaco” date --date = „TZ =” Pacific / 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"

Czas w Monako: 2017-10-11 13:56:00

P6039
źródło
Przeczytane „Dlaczego potrzebuję 50 reputacji do komentowania” aby upewnić się, że rozumiesz, jak możesz zacząć komentować.
Pimp Juice IT