我正在尝试让 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)
有什么办法可以在没有此类错误的情况下执行此转换?
要将要使用的日期传递给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 日期和时间。