2015-10-14 218 views
0

我需要將給定的日期時間從PST轉換爲UTC,我經歷了多個論壇示例,但它提到了有關轉換服務器日期時間的所有地方。那麼有人可以幫助我解決這個問題。轉換時間戳從PST到UTC

我將以yyyymmddhh的格式(例如:2015101004 - 它將是pdt)獲取我的腳本的參數,所以現在我需要將它轉換爲UTC格式相同的格式。

因此對於2015101010(PDT),我需要輸出爲(2015101017)UTC。有人能通過這裏的一些燈光。

注:我正在嘗試在linux bash shell中使用這個

謝謝。

+0

夏令時(DST)的狀態應該從日期本身推斷出來嗎?如果是這樣,請更新問題以包含此信息 - 可能有兩個示例:一個是DST處於活動狀態,另一個是DST處於非活動狀態。正如現在所寫,很難理解您是否只使用PDT,或者您是否也會處理PST。 –

+0

@Chrono,是的,我需要處理PST和PDT。你能不能推薦一些時間來處理這兩個時區。 – Jay

回答

1

您首先需要將日期時間標準化爲GNU日期實用程序可識別的格式。之後,您可以進一步將其歸一化爲RFC 3339時間戳,其中包含時區信息。通過該時區信息,GNU日期將允許您使用-u選項將該時區中的時間轉換爲UTC。這裏有一個腳本,做一切:

# Convert the "yyyymmddhh" string in argument $1 to "yyyy-mm-dd hh:00" and 
# pass the result to 'date --rfc-3339=seconds' to normalize the date. 
# The date is interpreted in the timezone specified by the value that 
# the "TZ" environment variable was at first invocation of the script. 
# 
# Example 1: 2015-12-10 10:00 PST (UTC-0800) 
# $ env TZ='America/Los_Angeles' ./utcdate 2015121010 
# 2015121018 
# 
# Example 2: 2015-10-10 10:00 PDT (UTC-0700; PST with DST in effect) 
# $ env TZ='America/Los_Angeles' ./utcdate 2015101010 
# 2015101017 

# Raw YYYYMMDDHH converted to YYYY-MM-DD HH:00. 
convldt="$(echo "$1" | awk ' 
$1 ~ /^[0-9]{10}/ 
{ 
    year = substr($0, 1, 4) 
    mon = substr($0, 5, 2) 
    day = substr($0, 7, 2) 
    hour = substr($0, 9, 2) 
    printf("%s-%s-%s %s:00\n", year, mon, day, hour) 
    exit 
} 
{ print "errorfmt" ; exit 1 } 
')" 
if test x"$convldt" = xerrorfmt ; then 
    echo "note: Format must be YYYYMMDDHH." >&2 
    exit 1 
fi 

# The converted time is then normalized to include a timezone. 
normldt="$(env TZ="$TZ" date -d "$convldt" --rfc-3339=seconds || echo error)" 
test x"$normldt" = xerror && exit 2 

# Convert to UTC.  
date -u -d "$normldt" +'%Y%m%d%H' 

然後你有一個通用腳本,它將對任何時區工作,你只需要設置TZ在命令行上作爲腳本的第一個註釋塊指出。該腳本將處理其餘的事情,當遇到錯誤時退出。 sed -r可能已經到位使用更簡潔的語法被使用的awk-r使POSIX ERES,這是什麼awk用於其正則表達式的語法; sed默認爲POSIX BREs裏面):

convldt="$(echo "$1" | sed -r 's/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})/\1-\2-\3 \4:00/')" 

我用awk主要是因爲閱讀起來更容易。 sed本來可以工作,但我真的不知道如何處理日期時間格式錯誤,因爲我使用的是awk。當需要錯誤處理時,sed似乎不是正確的工具。

如果您打算在OS X上使用此功能,而不僅限於Linux,請使用the date bits would need to be altered。另外,sed -r would instead be sed -E

+0

由於某些原因,我收到格式錯誤,[$ env TZ ='America/Los_Angeles'./d 2015101000 errorfmt 注意:格式必須爲YYYYMMDDHH。]當我嘗試打印convldt時,我注意到一個換行符,但它沒有幫助。任何想法這裏有什麼問題。 [$ env TZ ='America/Los_Angeles'./d 2015101000 2015101000 errorfmt date:invalid date'2015101000 \ nerrorfmt'] – Jay

+0

您可能沒有安裝GNU awk('gawk'),或者它不是您的默認的'awk'解釋器。我只是更新它與'mawk'兼容,這可能是麻煩。 –