날짜를 다른 시간대로 변환 + 형식 변경

날짜를 다른 시간대로 변환 + 형식 변경

"22.09.2016 08:22:54"("+%Y:%m:%d %H:%M:%S") 형식의 타임스탬프가 있는 로그 파일이 있습니다. 이 타임스탬프는 UTC 시간대입니다.

이제 bash 스크립트를 사용하여 이 타임스탬프를 유럽/헬싱키 타임스탬프로 변환해야 합니다.

내가 원하는 대로 변환하는 스크립트가 있습니다.

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

이것은 잘 작동하지만 날짜 "입력" 형식( -d "2015-05-20 18:05:02" )은 내 로그 타임스탬프 형식과 비교하여 다른 형식입니다.

이 스크립트를 다음과 같이 변경하고 싶습니다.

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

$1은 내 로그 파일 "22.09.2016 08:22:54"("+%Y:%m:%d %H:%M:%S")의 원래 날짜 형식일 수 있습니다.

나는 이것을 작동시킬 수 없습니다.. 누군가 나를 도와 줄 수 있습니까 .. 감사합니다

편집하다:

나는 이것과 다른 많은 조합을 시도했습니다 ..

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

하지만 그의 결말은 오류로 끝났습니다..

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

답변1

아닌 것 같아date입력 형식 문자열을 지원합니다. 따라서 계속 진행하여 현재까지의 문자열을 전달할 수는 없습니다. 매뉴얼 페이지에는 일반적인 형식을 허용한다고 명시되어 있으므로 로케일 설정이 이에 영향을 줄 수 있지만 확실하지 않습니다.

더 자세한 내용은 스크립트를 살펴보겠습니다.

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

여기서 일어나는 일은 매개변수를 Linux 타임스탬프로 변환한 $1다음 이를 다시 원하는 문자열로 변환하는 것입니다. 입력에 대해 이 작업을 수행하는 한 가지 가능한 방법은 $1문자열 매개변수의 형식을 다시 지정하는 것입니다.

sed적절한 정규식을 사용하여 예제로 이를 수행할 수 있습니다 . 유효한 문자열이 있는지 미리 확인해야 하며 형식을 변경하면 문자열이 깨질 수 있다는 점에 유의하세요.

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

편집: 잘못된 변수 이름을 사용하지 않는 것이 확실히 도움이 됩니다.

답변2

뉴질랜드 시간을 모나코 시간으로 변환하면 조금 더 좋아 보입니다.

TZ="유럽/모나코" 날짜 --date="TZ=\"태평양/오클랜드\" 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"

모나코 시간: 2017-10-11 13:56:00

답변3

MacOS(10.14.3)에서는 스위치를 통해 정확한 형식을 제공할 수 있으므로 꽤 잘 작동합니다 -f.

$ 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

그건 그렇고, 귀하의 로그 형식은 두 번째 코드 조각 이후에 언급한 것과 "+%d.%m.%Y %H:%M:%S"다릅니다 "+%Y:%m:%d %H:%M:%S". 그렇지 않으면 위의 코드에 정의된 줄에서 오류나 이와 유사한 내용이 sec발생할 가능성이 높습니다 .illegal time format

관련 정보