您首先需要將日期時間標準化爲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
。
夏令時(DST)的狀態應該從日期本身推斷出來嗎?如果是這樣,請更新問題以包含此信息 - 可能有兩個示例:一個是DST處於活動狀態,另一個是DST處於非活動狀態。正如現在所寫,很難理解您是否只使用PDT,或者您是否也會處理PST。 –
@Chrono,是的,我需要處理PST和PDT。你能不能推薦一些時間來處理這兩個時區。 – Jay