我有一個時間戳格式為“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) 上運作得很好,因為你可以透過-f
switch 提供確切的格式:
$ 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
錯誤或類似的內容。