15

是否有脚本可以在 *nix 终端上显示简单的世界时钟(世界各地的时间)?

我正在考虑编写一个快速的 Python 脚本,但我感觉工作量会比我想象的要多(例如,由于配置和输出格式)——更不用说重新发明轮子了……

4

7 回答 7

24

我有这个 bourne shell 脚本:

#!/bin/sh

PT=`env TZ=US/Pacific date`
CT=`env TZ=US/Central date`
AT=`env TZ=Australia/Melbourne date`

echo "Santa Clara    $PT"
echo "Central        $CT"
echo "Melbourne      $AT"
于 2008-12-15T23:50:55.650 回答
9

简单的系统

从来没想过,但做起来并不难。

#!/bin/sh
# Command-line world clock

: ${WORLDCLOCK_ZONES:=$HOME/etc/worldclock.zones}
: ${WORLDCLOCK_FORMAT:='+%Y-%m-%d %H:%M:%S %Z'}

while read zone
do echo $zone '!' $(TZ=$zone date "$WORLDCLOCK_FORMAT")
done < $WORLDCLOCK_ZONES |
awk -F '!' '{ printf "%-20s  %s\n", $1, $2;}'

给定输入文件:

US/Pacific
Europe/London
Europe/Paris
Asia/Kolkatta
Africa/Johannesburg
Asia/Tokyo
Asia/Shanghai

我得到了输出:

US/Pacific             2008-12-15 15:58:57 PST
Europe/London          2008-12-15 23:58:57 GMT
Europe/Paris           2008-12-16 00:58:57 CET
Asia/Kolkatta          2008-12-15 23:58:57 GMT
Africa/Johannesburg    2008-12-16 01:58:57 SAST
Asia/Tokyo             2008-12-16 08:58:57 JST
Asia/Shanghai          2008-12-16 07:58:57 CST

我很幸运,这用了不到一秒的时间运行并且没有跨越 1 秒的边界。

我没有注意到加尔各答失败并默认为格林威治标准时间。也许我的系统仍然有亚洲/加尔各答作为印度的条目。


修正错别字

十一年后,有人告诉我,我把Kolkata 拼错了两个 t,而应该只有一个。谢谢你,@ jbg。我还在数据文件中添加了两个额外的条目—— America/St_Johns(纽芬兰),Asia/Katmandu它们分别与 UTC 有半小时和四分之三小时的偏移(加尔各答也有半小时的偏移)。这会产生,例如:

US/Pacific             2020-01-09 06:17:40 PST
Europe/London          2020-01-09 14:17:40 GMT
Europe/Paris           2020-01-09 15:17:40 CET
Asia/Kolkata           2020-01-09 19:47:40 IST
Africa/Johannesburg    2020-01-09 16:17:40 SAST
Asia/Tokyo             2020-01-09 23:17:40 JST
Asia/Shanghai          2020-01-09 22:17:40 CST
America/St_Johns       2020-01-09 10:47:40 NST
Asia/Katmandu          2020-01-09 20:02:40 +0545

请注意,这US/Pacific是一个不受欢迎的古老时区名称;它应该是America/Los_Angeles

将区域按顺序排序可能是明智的。添加sort -b -r -k2,2 -k3,3以按顺序列出区域,其中最早于 UTC 的时区首先列出,最晚的时区最后列出。-b选项(忽略字段上的前导空格)很重要。添加另外三个区域 ( Pacific/Honolulu, Pacific/Kwajalein, Pacific/Kiritimati) 并给出:

Pacific/Kiritimati     2020-01-10 04:33:25 +14
Pacific/Kwajalein      2020-01-10 02:33:25 +12
Asia/Tokyo             2020-01-09 23:33:25 JST
Asia/Shanghai          2020-01-09 22:33:25 CST
Asia/Katmandu          2020-01-09 20:18:25 +0545
Asia/Kolkata           2020-01-09 20:03:25 IST
Africa/Johannesburg    2020-01-09 16:33:25 SAST
Europe/Paris           2020-01-09 15:33:25 CET
Europe/London          2020-01-09 14:33:25 GMT
America/St_Johns       2020-01-09 11:03:25 NST
US/Pacific             2020-01-09 06:33:25 PST
Pacific/Honolulu       2020-01-09 04:33:25 HST

请注意,基里蒂马蒂和火奴鲁鲁的时间相同,但日期相差一天。排序应该在脚本中,当然:

#!/bin/sh
# Command-line world clock

: ${WORLDCLOCK_ZONES:=$HOME/etc/worldclock.zones}
: ${WORLDCLOCK_FORMAT:='+%Y-%m-%d %H:%M:%S %Z'}

while read zone
do echo $zone '!' $(TZ=$zone date "$WORLDCLOCK_FORMAT")
done < $WORLDCLOCK_ZONES |
awk -F '!' '{ printf "%-20s  %s\n", $1, $2;}' |
sort -b -r -k2,2 -k3,3

worldclock.zones文件包含:

US/Pacific
Europe/London
Europe/Paris
Asia/Kolkata
Africa/Johannesburg
Asia/Tokyo
Asia/Shanghai
America/St_Johns
Asia/Katmandu
Pacific/Honolulu
Pacific/Kwajalein
Pacific/Kiritimati
Pacific/Pago_Pago
UTC-12

在 UTC+14,Kiritimati 与 UTC 的正偏移量最大。 Pacific/Pago_Pago是在 UTC-11 与 UTC 的负偏移量最大的地方之一。如果你去World Time Zone,他们列出了两个无人居住的岛屿,如果有人居住,它们可能位于 UTC-12。但是,Olson 数据库没有记录自 1970 年 1 月 1 日截止日期以来无人居住的地方的时区信息,因此它们没有被列出。

环游世界 26 个时区

为了娱乐(简单的头脑很容易偏离轨道),这里有一个时区名称列表,其中一个名称来自世界上大多数时区偏移量。如果有任何其他小数小时偏移量正在使用(澳大利亚?),请告诉我。请注意标准时间与夏令时 - 南半球的某些条目可能处于夏令时。在 2020 年 1 月,该列表会生成所有积分小时偏移量,但在 2020 年 6 月可能不会这样做。

该列表包括两个组成的区域名称:FarEast-12FarWest+12,分别为 UTC+12 和 UTC-12。正面和负面之间的冲突是因为存在相互冲突的标准。ISO 8601 规定 UTC 以东(格林威治子午线,或多或少)的地方使用与 UTC 的正偏移,而 UTC 以西的地方使用负偏移。同时,POSIX(又名 ISO 9045)指定了相反的约定——UTC 以西的地方使用正偏移量,而东部的地方使用负偏移量。这两个名称是用于 TZ 环境变量的 POSIX 时区名称,并指定了偏移量且没有夏令时规则。它们受 POSIX 偏移规则的约束。为什么会出现差异?从根本上说,POSIX 遵循 Unix 的约定——它不能在不破坏大量代码的情况下改变它们。

区域名称列表:

US/Pacific
Europe/London
Europe/Paris
Asia/Kolkata
Africa/Johannesburg
Asia/Tokyo
Asia/Shanghai
America/St_Johns
Asia/Katmandu
Pacific/Honolulu
Pacific/Kwajalein
Pacific/Kiritimati
Pacific/Pago_Pago
FarEast-12
FarWest+12
US/Eastern
US/Central
US/Mountain
US/Alaska
Asia/Vladivostok
Pacific/Noumea
Pacific/Enderbury
Asia/Bangkok
Asia/Thimphu
Asia/Aqtau
Asia/Dubai
Africa/Addis_Ababa
Atlantic/Cape_Verde
Atlantic/South_Georgia
America/Santiago
America/Halifax

修改后的脚本的示例输出(排序到位):

Pacific/Kiritimati        2020-01-10 05:24:10 +14
Pacific/Enderbury         2020-01-10 04:24:10 +13
Pacific/Kwajalein         2020-01-10 03:24:10 +12
FarEast-12                2020-01-10 03:24:10 FarEast
Pacific/Noumea            2020-01-10 02:24:10 +11
Asia/Vladivostok          2020-01-10 01:24:10 +10
Asia/Tokyo                2020-01-10 00:24:10 JST
Asia/Shanghai             2020-01-09 23:24:10 CST
Asia/Bangkok              2020-01-09 22:24:10 +07
Asia/Thimphu              2020-01-09 21:24:10 +06
Asia/Katmandu             2020-01-09 21:09:10 +0545
Asia/Kolkata              2020-01-09 20:54:10 IST
Asia/Aqtau                2020-01-09 20:24:10 +05
Asia/Dubai                2020-01-09 19:24:10 +04
Africa/Addis_Ababa        2020-01-09 18:24:10 EAT
Africa/Johannesburg       2020-01-09 17:24:10 SAST
Europe/Paris              2020-01-09 16:24:10 CET
Europe/London             2020-01-09 15:24:10 GMT
Atlantic/Cape_Verde       2020-01-09 14:24:10 -01
Atlantic/South_Georgia    2020-01-09 13:24:10 -02
America/Santiago          2020-01-09 12:24:10 -03
America/St_Johns          2020-01-09 11:54:10 NST
America/Halifax           2020-01-09 11:24:10 AST
US/Eastern                2020-01-09 10:24:10 EST
US/Central                2020-01-09 09:24:10 CST
US/Mountain               2020-01-09 08:24:10 MST
US/Pacific                2020-01-09 07:24:10 PST
US/Alaska                 2020-01-09 06:24:10 AKST
Pacific/Honolulu          2020-01-09 05:24:10 HST
Pacific/Pago_Pago         2020-01-09 04:24:10 SST
FarWest+12                2020-01-09 03:24:10 FarWest

时间流逝; 现在是东京的午夜过后。

于 2008-12-15T23:59:24.603 回答
3

我使用它,这与其他建议基本相同,除了它过滤您想要查看的特定区域:

#!/bin/sh

# Show date and time in other time zones

search=$1

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

find -L $zoneinfo -type f \
    | grep -i "$search" \
    | while read z
      do
          d=$(TZ=$z date +"$format")
          printf "%-34s %23s\n" ${z#$zoneinfo} "$d"
      done

样本输出:

$ /usr/local/bin/wdate bang
Africa/Bangui                      Fri 2009-03-06 11:04:24
Asia/Bangkok                       Fri 2009-03-06 17:04:24

更新:

在带有 的当前系统上systemdtimedatectl list-timezones可以替换通过文件系统搜索来获取时区名称。

因此,该脚本的更简单版本现在可以是:

#!/bin/sh

# Show date and time in other time zones

search=$1
format='%a %F %T'

timedatectl list-timezones \
| grep -i "$search"        \
| while read z
  do
      d=$(TZ=$z date +"$format")
      printf "%-34s %23s\n" "$z" "$d"
  done

find或者如果timedatectl命令不可用,则回退到完整版本:

#!/bin/sh

# Show date and time in other time zones

search=$1

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

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


grep -i "$search" <<< "$tzlist" \
| while read z
  do
      d=$(TZ=$z date +"$format")
      printf "%-34s %23s\n" ${z#$zoneinfo} "$d"
  done
于 2009-03-06T10:10:01.877 回答
1

如果您仍然想用 Python 编写它,请考虑 Pytz:

http://pytz.sourceforge.net/

他们的首页向您展示了许多简单的方法来完成您正在寻找的东西。

也就是说,我敢肯定,如果您在 Google 上花费几分钟,您会发现大量脚本,其中一些甚至可以为 *nix 启动图形程序。“python 世界时钟”的第一个结果列表似乎单独表明了这一点。

于 2008-12-15T23:48:56.857 回答
1

我创建了一个简单的 shell 脚本,您可以调用它来打印该给定位置的位置和日期/时间。它此时此刻的逻辑:

TIME_ZONES="Europe/Amsterdam America/Los_Angeles Europe/Dublin"
OUTPUT=""

for loc in $TIME_ZONES; do
    CITY=`echo $loc | sed 's/\// /g' | awk '{ print $2 }'`
    CUR_TIME=`TZ=${loc} date | awk '{ print $2 " " $3 " " $5 }'`
    TEMP=`awk -v l="$CITY" -v t="$CUR_TIME" 'BEGIN { print l "\t" t }'`
    OUTPUT="${OUTPUT}\n${TEMP}"
done

echo $OUTPUT | column -t

回报:

Amsterdam    1   Nov  01:03:30
Los_Angeles  31  Oct  17:03:30
Dublin       1   Nov  00:03:30
于 2018-11-01T00:09:25.733 回答
1

./cpython-2.7/Demo/curses/tclock.pytclock.c1994 ASCII 模拟/数字时钟的端口curses,来自 ncurses-examples。用法:

$ TZ=Europe/Paris python tclock.py

这是视频

于 2015-08-13T23:52:02.723 回答
0

我喜欢提供的脚本mivk。因为我希望能够在没有正则表达式的情况下指定多个区域,所以当我无法让 bourne shell 处理数组时,我调整了脚本以使用 bash。无论如何,享受并感谢一个很棒的论坛:

#!/usr/bin/env bash                                                             

# Show date and time in other time zones, with multiple args                                        


elements=$@

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

for search in ${elements[@]}; do

  find $zoneinfo -type f \
      | grep -i "$search" \
      | while read z
        do
            d=$(TZ=$z date +"$format")
            printf "%-34s %23s\n" ${z#$zoneinfo} "$d"
        done
done

样本输出:

/usr/local/bin/wdate Sydney Stockholm /Australia/Sydney Fri 2015-08-14 05:54:26 /Europe/Stockholm Thu 2015-08-13 21:54:26

于 2015-08-13T20:02:00.070 回答