Linux 如何在shell脚本中显示存储在不同时区变量中的日期

Linux 如何在shell脚本中显示存储在不同时区变量中的日期,linux,shell,date,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') 但它不起作用。谁能告诉我我的错误是什么吗?时区!都是关于时区的 你想把时间储存在你当前的区域,所以你说 TZ=UTC then="$(date -d '20120101 14

我有一个存储在变量中的日期

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')

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

时区!都是关于时区的

你想把时间储存在你当前的区域,所以你说

TZ=UTC
then="$(date -d '20120101 14:13:12' +'%Y%m%d %H:%M:%S')"
现在你有了一个日期字符串!但是等等,那个日期是UTC还是美国/东部?我们的区域设置为UTC,但让我们看看该值

echo "$then"
20120101 14:13:12
有趣的是,我没有看到一个区域。。。我怎么知道现在是UTC时间?答案很简单:你不能!您必须在字符串中对区域进行编码,否则它就在当前区域中

您可以更改区域
日期
用于下一次运行:

eastern="$(TZ=US/Eastern date -d "$then" +%Y-%m%dT%H:%M:%S)"
echo "$eastern"
2012-01-01T14:13:12
但是等等,这不是同一时间吗?是的,但现在是东部。。。你就是说不出来,因为你没有打印区域。输入没有指定区域,因此它被读取为Eastern,然后转换为输出区域Eastern,并被写入Eastern,忽略区域

为了在区域之间转换,您必须在时间字符串中包含该区域

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
的输入中包含了该区域,并且告诉
日期
在不同的区域中输出,因此时间发生了变化。如果您确实想:

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

但是您不应该忽略该区域,因为时间字符串的后续用户将不知道它代表什么区域。

我认为您不应该在时区的开头有
。什么是
$b
,不应该是
$myTime
?由于您的输入
-d
是固定的,因此无论您请求哪个区域,您都将看到相同的结果字符串,除非您在输出中包含该区域(并且您应该将其包含在输入中)。记住在指定区域中读取和写入的日期。@Barmar您是对的,它必须是$MyTimes,因为格式正是您手动指定的格式,加上您仍然需要的区域。