将时间戳从PST转换为UTC

时间:2015-10-14 21:24:54

标签: bash shell unix

我需要将给定的日期时间从PST转换为UTC,我经历了多个论坛示例,但它提到了有关转换服务器日期时间的所有内容。所以有人可以帮助我。

我将以yyyymmddhh的格式获取我的脚本的参数(例如:2015101004 - 它将是pdt),所以现在我需要将它转换为具有相同格式的UTC。

因此对于2015101010(PDT),我需要输出为(2015101017)UTC。有人可以通过这里的灯光。

注意:我在linux bash shell中尝试这个

感谢。

1 个答案:

答案 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