在 UNIX 时间戳 Shell/Bash 中将日期与时区转换

Vic*_*ria 3 unix linux bash shell

我需要将日期从格式为“yyyy/mm/dd hh:mm:ss TZ”的字符串转换为 UNIX 时间(TZ = 时区)。

\n\n

到目前为止我所做的是将没有时区的“yyyy/mm/dd hh:mm:ss”格式的日期转换为时间戳

\n\n
dateYMD="2019/2/28 12:23:11.46"\nnewt=$(date -d "${dateYMD}" +"%s")\necho ${newt}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到以下结果。

\n\n
1551349391\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的努力是找到如何将时区和日期/时间转换为时间戳(unix time)。例如,我需要 4 个与 dateYMD 具有相同日期/时间但位于 4 个不同时区的变量,以便它们的时间戳会不同。

\n\n

这是我尝试过的最新版本

\n\n
dateYMD="2017/09/09 08:58:09"\ntimez=$(TZ=Australia/Sydney date -d @$(date +%s -d "${dateYMD}"))\nunixTimez=$( date --date "${timez}" +"%s" )\necho ${unixTimez}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这向我显示了以下错误

\n\n
   date: invalid date \xe2\x80\x98\xd1\x87\xd1\x82 \xd1\x84\xd0\xb5\xd0\xb2 28 21:23:11 AEDT 2019\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n

Bar*_*mar 9

你不需要打date两次电话。只需调用一次并TZ设置您想要该变量的时区即可。

timesydney=$(TZ=Australia/Sydney date -d "$dateYMD" +%s)
timenyc=$(TZ=US/Eastern date -d "$dateYMD" +%s)
Run Code Online (Sandbox Code Playgroud)


Wii*_*imm 5

您可以通过设置环境变量来完成此操作TZ=(请参阅 Barmar 的回答),或者将时区包含到时间字符串中。这比 TZ= 具有更高的优先级。

例子:

TZ=UTC date -d '2019-01-01 12:00 CET' +'%s, %F %T %Z %z'
TZ=CET date -d '2019-01-01 12:00 CET' +'%s, %F %T %Z %z'
TZ=UTC date -d '2019-01-01 12:00 PDT' +'%s, %F %T %Z %z'
TZ=CET date -d '2019-01-01 12:00 PDT' +'%s, %F %T %Z %z'
TZ=UTC date -d '2019-01-01 12:00 +500' +'%s, %F %T %Z %z'
Run Code Online (Sandbox Code Playgroud)

将打印

1546340400, 2019-01-01 11:00:00 UTC +0000
1546340400, 2019-01-01 12:00:00 CET +0100
1546369200, 2019-01-01 19:00:00 UTC +0000
1546369200, 2019-01-01 20:00:00 CET +0100
1546326000, 2019-01-01 07:00:00 UTC +0000
Run Code Online (Sandbox Code Playgroud)