мировые часы командной строки?

Существует ли скрипт для отображения простых мировых часов (время в разных местах по всему миру) на терминале * nix?

Я думал о написании быстрого скрипта Python, но у меня есть ощущение, что будет больше работы, чем я думаю (например, из-за конфигурации и формата вывода) - не говоря уже о изобретении колеса ...

15.12.2008 23:39:23
7 ОТВЕТОВ

Если вы все еще хотите написать это на Python, рассмотрите Pytz:

http://pytz.sourceforge.net/

На их главной странице вы найдете много простых способов выполнить то, что вы ищете.

Тем не менее, я уверен, что если вы потратите несколько минут на Google, вы найдете тонны сценариев, некоторые из которых даже запускают графические программы для * nix. Первый список результатов для "Python World Clock", кажется, предполагает это в одиночку.

1
15.12.2008 23:48:56

У меня есть сценарий оболочки Bourne:

#!/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"
18
15.12.2008 23:50:55
Отлично. Для тех, кому нужен список часовых
AllenH 11.05.2011 22:43:58
Или, если вы используете zsh, timedatectl set-timezone <TAB>вы получите список часовых поясов прямо в командной строке.
ricma 22.03.2019 20:11:28
@ricma Это прекрасно работает и в bash - systemd предоставляет дополнения для обеих оболочек.
jbg 9.01.2020 12:09:17
@jbg Действительно, ты совершенно прав! Я только что посмотрел на функцию завершения, и они вызывают systemd, timedatectl list-timezonesкоторый генерирует весь список. Спасибо за указатель!
ricma 10.01.2020 18:19:35

Простая система

Никогда не думал об этом, но не так уж трудно сделать.

#!/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-секундную границу.

( Я не заметил, что Kolkatta потерпела неудачу и по умолчанию выбрала GMT. Возможно, моя система все еще использует Азию / Калькутту в качестве входа для Индии. )


Исправление опечаток

Одиннадцать лет спустя мне сказали, что я неправильно написал Калькутту с двумя т, где должен быть только один; спасибо, @ 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 на UTC + 14. Pacific/Pago_Pagoявляется одним из мест с самым отрицательным смещением от UTC на UTC-11. Если вы перейдете в Мировой часовой пояс , они перечислят два необитаемых острова, которые, если они будут населены, вероятно, будут в UTC-12. Тем не менее, база данных Olson не записывает информацию о часовом поясе для мест, необитаемых с момента ее закрытия 1970-01-01, поэтому они не перечислены.

Вокруг света в 26 часовых поясах

Для развлечения (простые умы легко отвлекаются), вот список имен часовых поясов с одним именем из большинства смещений часовых поясов по всему миру. Если есть какие-либо другие сдвиги дробного часа (Австралия?), Пожалуйста, дайте мне знать. Остерегайтесь стандартного и летнего времени - некоторые записи для южного полушария могут быть в летнее время. В январе 2020 года в списке генерируются все смещения целых часов, но в июне 2020 года этого не произойдет.

Список включает в себя два составляет название зоны: FarEast-12иFarWest+12которые находятся в UTC + 12 и UTC-12 соответственно. Этот конфликт между положительным и отрицательным возникает из-за противоречивых стандартов. ISO 8601 указывает, что места к востоку от UTC (гринвичский меридиан, более или менее) используют положительные смещения от UTC, а места к западу от UTC используют отрицательные смещения. Между тем, POSIX (он же ISO 9045) определяет противоположное соглашение - места к западу от UTC используют положительное смещение, а те, что на востоке, используют отрицательное смещение. Эти два имени являются именами часовых поясов POSIX для использования с переменной среды TZ и задаются со смещением и без правила перехода на летнее время. Они подчиняются правилам смещения 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

Время проходит; это сейчас после полуночи в Токио.

6
9.01.2020 15:37:40
Asia/Kolkata(один t) работает здесь.
jbg 9.01.2020 12:09:58
@jbg - спасибо! Потребовалось одиннадцать лет, чтобы объяснить опечатку.
Jonathan Leffler 9.01.2020 13:36:47

Я использую это, которое в основном совпадает с другими предложениями, за исключением того, что оно фильтрует определенные зоны, которые вы хотите увидеть:

#!/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
2
22.03.2020 13:17:03

Мне нравится сценарий mivk при условии. Поскольку я хочу иметь возможность указывать несколько зон без регулярных выражений, я адаптировал скрипт для использования bash, когда я не мог заставить оболочку bourne работать с массивами. В любом случае, наслаждайтесь и спасибо за отличный форум:

#!/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

0
23.05.2017 12:15:24

Существует ./cpython-2.7/Demo/curses/tclock.py, который является портом tclock.cаналоговых / цифровых часов ASCII 1994 года для curses, из примеров ncurses. Применение:

$ TZ=Europe/Paris python tclock.py

Вот видео .

1
14.08.2015 00:47:06

Я создал простой сценарий оболочки, который вы можете вызвать, чтобы напечатать местоположение и дату / время в данном месте. Его логика в данный момент времени:

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
1
1.11.2018 00:09:25
Отличный лаконичный подход! Чтобы получить пробелы вместо echo $OUTPUT | column -techo $OUTPUT | column -t | tr '_' ' '
Igor 16.07.2019 15:05:58