如何在shell脚本中显示存储在变量中的日期

时间:2016-10-28 22:00:14

标签: linux shell date

我有一个存储在变量

中的日期
myTime=$(date -d "20120101 14:13:12" +'%Y%m%d %H:%M:%S') 

我希望在不导出时区变量的情况下在不同的时区显示它。我试过这个命令:

c=$(TZ=":US/Eastern" date -d "$myTime" +'%Y%m%d %H:%M:%S')

但它不起作用。谁能告诉我我的错误是什么?

1 个答案:

答案 0 :(得分:3)

时区!这完全是关于时区的。

您希望将存储在当前区域中,所以您要说

TZ=UTC
then="$(date -d '20120101 14:13:12' +'%Y%m%d %H:%M:%S')"

现在你有一个日期字符串!但等等,那是UTC或US / Eastern的那个日期?我们的区域设置为UTC,但让我们查看该值...

echo "$then"
20120101 14:13:12

好笑,我没有看到某个区域......我怎么知道它是在UTC 的时间?简单的回答:你不能!您必须在字符串中对区域进行编码,或者在当前区域对其进行编码。

您可以更改下一次运行的区域date用途:

eastern="$(TZ=US/Eastern date -d "$then" +%Y-%m%dT%H:%M:%S)"
echo "$eastern"
2012-01-01T14:13:12

但等等,不是同一时间吗?是的,但是现在它是东方的...你只是不能告诉它,因为你没有打印区域。输入没有指定区域,所以它被读作东方,然后转换为输出区域,这是东方,并写为东方,省略区域。

为了在区域之间进行转换必须在时间字符串中包含区域。

GNU日期非常好,如果你问的话会包含这个:

then="$(TZ=UTC date -d '20120101 14:13:12' --rfc-3339=seconds)"
echo "$then"
2012-01-01 14:13:12+00:00

现在您在输入区域中看到输入日期/时间,并且知道它在输入区域中,因为+00:00告诉您。

现在你可以回去尝试转换它:

eastern="$(TZ=US/Eastern date -d "$then" --rfc-3339=seconds)"
echo "$eastern"
2012-01-01 09:13:12-05:00

啊哈!现在,因为您将输入中的区域包含在-d中并且您告诉date输出到其他区域,所以时间已经改变。如果您真的想要,可以在此步骤中以输出格式省略区域:

eastern="$(TZ=US/Eastern date -d "$then" '%Y-%m-%d %H:%M:%S')"
echo "$eastern"
2012-01-01 09:13:12

但是你不应该省略该区域,因为时间字符串的后来用户不知道它所代表的区域。