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

标签 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: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

但是等等,这不是同一时间吗?嗯,是的,但现在是东部......你只是无法分辨出来,因为你没有打印该区域。输入未指定区域,因此它被读取为东部,然后转换为输出区域(东部),并以东部形式写出,并省略区域。

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

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

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

关于linux - 如何在shell脚本中显示不同时区变量中存储的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40313753/

相关文章:

linux - 在某些情况下 SIGKILL 不起作用吗?

使用 Azure CLI 的 Bash 脚本

ruby-on-rails - Date.step() 方法的 Ruby 正确用法

bash - 替换 shell 脚本参数中的环境变量

linux - awk 自动舍入输出

date - 从用户的本地时间到网站上的UTC的日期/时间转换

javascript - Javascript - 发票到期日计算错误

linux - 为什么这段代码不会置换值 Z?

linux - GCC是否支持命令文件

c - 嵌入式系统开发为什么要烧录根文件系统