Bash:从另一个时区获取日期和时间

ale*_*c89 7 bash timezone date


我想使用 bash 命令从另一个时区 (UTC-4) 获取日期和时间,但我不想将其配置为系统的默认 TZ。
有没有简单的方法来做到这一点?
例如 1(当前):

$ date
fri nov  7 13:15:35 UTC 2014
Run Code Online (Sandbox Code Playgroud)

例如2(我需要的):

$ date (+ some option for UTC-4)
fri nov  7 09:15:35 UTC 2014
Run Code Online (Sandbox Code Playgroud)

SMA*_*SMA 13

你可以用

TZ=America/New_York date
Run Code Online (Sandbox Code Playgroud)

或者如果你想做日期算术,你可以使用

date -d "+5 hours"
Run Code Online (Sandbox Code Playgroud)

  • 但它要求您知道所需时区的正确名称,有时很难找到。您也可以使用数字偏移量,尽管这并不明显。[timezone(3)](http://linux.die.net/man/3/timezone) 手册页有血腥的细节。 (4认同)

miv*_*ivk 8

我为此使用了一个小脚本,因此我不必知道或记住我正在寻找的时区的确切名称。该脚本采用搜索字符串作为参数,并给出与搜索匹配的任何时区的日期和时间。我给它起了个名字wdate

#!/bin/bash

# Show date and time in other time zones

search=$1

format='%a %F %T %z'
zoneinfo=/usr/share/zoneinfo/posix/

if command -v timedatectl >/dev/null; then
    tzlist=$(timedatectl list-timezones)
else
    tzlist=$(find -L $zoneinfo -type f -printf "%P\n")
fi

grep -i "$search" <<< "$tzlist" \
| while read z
  do
      d=$(TZ=$z date +"$format")
      printf "%-32s %s\n" "$z" "$d"
  done
Run Code Online (Sandbox Code Playgroud)

输出示例:

$ wdate fax
America/Halifax                  Fri 2022-03-25 09:59:02 -0300
Run Code Online (Sandbox Code Playgroud)

或者

$ wdate canad
Canada/Atlantic                  Fri 2022-03-25 10:00:04 -0300
Canada/Central                   Fri 2022-03-25 08:00:04 -0500
Canada/Eastern                   Fri 2022-03-25 09:00:04 -0400
Canada/Mountain                  Fri 2022-03-25 07:00:04 -0600
Canada/Newfoundland              Fri 2022-03-25 10:30:04 -0230
Canada/Pacific                   Fri 2022-03-25 06:00:04 -0700
Canada/Saskatchewan              Fri 2022-03-25 07:00:04 -0600
Canada/Yukon                     Fri 2022-03-25 06:00:04 -0700
Run Code Online (Sandbox Code Playgroud)


anu*_*ava 7

您可以使用偏移值TZ来获取不同时区的日期:

TZ=UTC date -R
Fri, 07 Nov 2014 13:55:07 +0000

TZ=UTC+4 date -R
Fri, 07 Nov 2014 09:54:52 -0400
Run Code Online (Sandbox Code Playgroud)

  • 你不需要子外壳。`TZ=UTC date` 设置 `TZ`,运行 `date`,并将 `TZ` 的值恢复为其之前的值(未设置,或不同的值,或与您指定的值相同,视情况而定) )。 (2认同)
  • 另外,`TZ=UTC-4 date` 会混淆地将时区打印为“UTC”,尽管事实并非如此。(这在您的示例输出中也可见。) (2认同)