我需要将给定的日期时间从PST转换为UTC,我经历了多个论坛示例,但它提到了有关转换服务器日期时间的所有内容。所以有人可以帮助我。
我将以yyyymmddhh的格式获取我的脚本的参数(例如:2015101004 - 它将是pdt),所以现在我需要将它转换为具有相同格式的UTC。
因此对于2015101010(PDT),我需要输出为(2015101017)UTC。有人可以通过这里的灯光。
注意:我在linux bash shell中尝试这个
感谢。
答案 0 :(得分: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 ERE,这是awk
用于其正则表达式语法的内容; {{1默认为POSIX BREs):
sed
我使用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
似乎不是正确的工具。
如果您打算在OS X上使用它,而不仅仅是Linux,the date
bits would need to be altered。此外,sed -r
would instead be sed -E
。