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

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

我正在尝试让 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,这已在上一个答案中进行了描述

相关内容