如何将本地日期时间转换为 UTC 日期时间?

Fra*_*nco 4 date

我正在尝试让 bash 脚本正常工作,为此我需要将本地时间的+%Y%m%d%H%M%S格式(例如:“20150903170731”)转换为相同格式的 UTC 时间。

我知道date -u可以给我当前的 UTC 时间:

$ date +%Y%m%d%H%M%S  -u
20150903161322
Run Code Online (Sandbox Code Playgroud)

或者,没有-u本地时间(这里是 BST):

$ date +%Y%m%d%H%M%S
20150903171322
Run Code Online (Sandbox Code Playgroud)

现在,如果我向 中添加参数date,则会收到错误消息:

echo "20150903154607" | xargs date +"%Y%m%d%H%M%S" -u
date: extra operand `20150903154607'
Run Code Online (Sandbox Code Playgroud)

有什么办法可以在没有此类错误的情况下执行此转换?

Tob*_*ght 7

要将要使用的日期传递给date,请使用该-d选项。所以你的命令看起来像echo "20150903154607" | xargs date +"%Y%m%d%H%M%S" -u -d.

但是,它并不完全采用您提供的日期格式:

$ date -d 20150903154607
date: invalid date ‘20150903154607’
$ date -d 20150903\ 15:46:07
Thu Sep  3 15:46:07 BST 2015
Run Code Online (Sandbox Code Playgroud)

所以先按摩一下(GNU sed):

$ echo "20150903154607" \
   | sed -re 's/^([0-9]{8})([0-9]{2})([0-9]{2})([0-9]{2})$/\1\\ \2:\3:\4/' \
   | xargs date -u -d
Thu Sep  3 15:46:07 UTC 2015
Run Code Online (Sandbox Code Playgroud)

要将本地转换为 UTC,您需要做更多的工作,因为-u会影响输入和输出日期的解释:

$ echo "20150903171734" \
   | sed -re 's/^([0-9]{8})([0-9]{2})([0-9]{2})([0-9]{2})$/\1\\ \2:\3:\4/' \
   | xargs date +@%s -d \
   | xargs date -u +%Y%m%d%H%M%S -d
20150903161734
Run Code Online (Sandbox Code Playgroud)

以上的第一次调用date将本地时间(根据$TZ)转换为自纪元以来的秒数;然后第二个将纪元秒转换为 UTC 日期和时间。