將日期轉換為不同時區+格式更改

將日期轉換為不同時區+格式更改

我有一個時間戳格式為“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")

這裡發生的事情是,您將參數轉換$1為 Linux 時間戳,然後再次將其轉換為您想要的字串。使此功能與您的輸入一起工作的一種可能方法是重新格式化$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) 上運作得很好,因為你可以透過-fswitch 提供確切的格式:

$ 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錯誤或類似的內容。

相關內容