我正在尝试让 bash 脚本正常工作,为此我需要将本地时间+%Y%m%d%H%M%S
格式(例如:“20150903170731”)转换为相同格式的 UTC 时间。
我知道date -u
可以给我当前的 UTC 时间:
$ date +%Y%m%d%H%M%S -u
20150903161322
或者,没有-u
当地时间(此处为 BST):
$ date +%Y%m%d%H%M%S
20150903171322
现在,如果我添加一个参数date
,我会收到一个错误:
echo "20150903154607" | xargs date +"%Y%m%d%H%M%S" -u
date: extra operand `20150903154607'
有什么方法可以执行此转换而不会出现此类错误?
答案1
要将要使用的日期传递给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
所以先稍微按摩一下(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
要将本地时间转换为 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
上面的第一次调用date
将本地时间(根据$TZ
)转换为自纪元以来的秒数;然后第二个将纪元秒转换为 UTC 日期和时间。
答案2
我还使用了更简单的东西:
date -u -d @$(date -d '2019-09-17 19:29:45' +%s)
Tue Sep 17 23:29:45 UTC 2019
您仍然需要从自定义格式转换为可以理解的格式date
,这已在上一个答案中进行了描述