是否有脚本可以在 *nix 终端上显示简单的世界时钟(世界各地的时间)?
我正在考虑编写一个快速的 Python 脚本,但我感觉工作量会比我想象的要多(例如,由于配置和输出格式)——更不用说重新发明轮子了……
是否有脚本可以在 *nix 终端上显示简单的世界时钟(世界各地的时间)?
我正在考虑编写一个快速的 Python 脚本,但我感觉工作量会比我想象的要多(例如,由于配置和输出格式)——更不用说重新发明轮子了……
我有这个 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"
从来没想过,但做起来并不难。
#!/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 日截止日期以来无人居住的地方的时区信息,因此它们没有被列出。
为了娱乐(简单的头脑很容易偏离轨道),这里有一个时区名称列表,其中一个名称来自世界上大多数时区偏移量。如果有任何其他小数小时偏移量正在使用(澳大利亚?),请告诉我。请注意标准时间与夏令时 - 南半球的某些条目可能处于夏令时。在 2020 年 1 月,该列表会生成所有积分小时偏移量,但在 2020 年 6 月可能不会这样做。
该列表包括两个组成的区域名称:FarEast-12
和FarWest+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
时间流逝; 现在是东京的午夜过后。
我使用它,这与其他建议基本相同,除了它过滤您想要查看的特定区域:
#!/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
更新:
在带有 的当前系统上systemd
,timedatectl 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
如果您仍然想用 Python 编写它,请考虑 Pytz:
他们的首页向您展示了许多简单的方法来完成您正在寻找的东西。
也就是说,我敢肯定,如果您在 Google 上花费几分钟,您会发现大量脚本,其中一些甚至可以为 *nix 启动图形程序。“python 世界时钟”的第一个结果列表似乎单独表明了这一点。
我创建了一个简单的 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
./cpython-2.7/Demo/curses/tclock.py是tclock.c
1994 ASCII 模拟/数字时钟的端口curses
,来自 ncurses-examples。用法:
$ TZ=Europe/Paris python tclock.py
这是视频。
我喜欢提供的脚本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