Преобразование часового пояса с помощью командной строки

19

Я знаю о http://www.timeanddate.com/worldclock/converter.html

Я не могу понять, как запросить http://www.google.com в нормальном естественном формате, например, "5 вечера BST в PST".

Или я должен написать такое приложение?

Хендри
источник
Что ты конкретно имеешь ввиду? Командная строка Linux? Команду вы можете ввести в Google? Какая?!
Даль Хундал
командная строка в оболочке и окно запроса Google являются для меня командной строкой
hendry
1
возможно лучший инструмент сделал бы города кодами аэропорта, 5 вечера LHR в SFO
hendry
@hendry dateutils может выполнять преобразование часового пояса на основе кодов аэропортов iata и icao: dateconv 2017-05-16T17:00 --from-zone iata:SFO --zone iata:LHR->2017-05-17T01:00:00
hroptatyr

Ответы:

35

В Тайбэе 6 вечера, который час?

date --date='TZ="Asia/Taipei" 18:00'
Fri Jul 16 11:00:00 BST 2010

В 11 часов утра здесь, в Лондоне, сколько времени в Тайбэе?

TZ=Asia/Taipei date -d "11:00 BST"
Fri Jul 16 18:00:00 CST 2010
Хендри
источник
Странно, но первый способ не работает для меня: TZ=Europe/Moscow date --date='TZ="Asia/Taipei" 18:00' Mon Mar 27 18:00:00 CST 2017т.е. он просто сообщает мне дату в Тайбэе, а не мою местную дату для этого времени. Хотя manpage говорит, что ваш метод правильный. Я что-то упустил? .. coreutils 8.26, Arch Linux
MarSoft
Чтобы найти идентификатор часового пояса, используйте что-то вроде: timedatectl list-timezones|grep -i taipei(распечатки Asia/Taipei), timedatectl list-timezones|grep -i berlin(распечатки Europe/Berlin), timedatectl list-timezones|grep -i angeles(распечатки America/Los_Angeles)
exebook
5

Этот пример взят из http://www.pixelbeat.org/cmdline.html#dates

Это дает местное время, соответствующее 9:00 на западном побережье США, учитывая различные переходы дневного света.

date --date='TZ="America/Los_Angeles" 09:00 next Fri'

Используйте tzselect, чтобы получить TZ. Формат PST неоднозначен. IST = индийское стандартное время и ирландское летнее время, например.

pixelbeat
источник
2
Не знал о tzselect, спасибо. Если вы введете неправильный ввод 'TZ', вы можете получить вводящие в заблуждение результаты, например, TZ = Лондонская дата Пт 16 июля 10:28:52 Лондон 2010
Хендри
5

Я думаю, что это ближе к тому, что спросил ОП (поскольку он не обязательно знает, что BST является Тайбэем? И ответ не объясняет, как добраться до «Азии / Тайбэя» из «BST»).

Сначала моя текущая дата:

$ date
Mon Apr 21 13:07:21 MDT 2014

Тогда дата, которую я хочу знать:

$ date -d '5pm BST'
Mon Apr 21 15:00:00 MDT 2014

Так что я знаю, что 5pm BSTэто 2 часа.

Я обычно забываю, нужно ли мне добавлять или удалять два часа из времени EDT, поэтому у меня есть небольшой сценарий с общими часовыми поясами, с которыми я должен работать:

$ cat tz
#!/bin/bash
TZ='America/Edmonton' date
TZ='America/Chicago' date
TZ='America/New_York' date

И вывод:

$ tz
Mon Apr 21 13:12:32 MDT 2014
Mon Apr 21 14:12:32 CDT 2014
Mon Apr 21 15:12:32 EDT 2014

Действительные места для вашего tzскрипта можно найти здесь /usr/share/zoneinfo.

Но опять же, для времен в будущем я просто использую date -d '<time> <timezone>'.

DavidG
источник
2

Используйте Wolfram Alpha . На основной URL ...

http://www.wolframalpha.com/input/?i=

добавить преобразование с заменой пробелов на +. Например:

http://www.wolframalpha.com/input/?i=5+PM+CET+to+PST

Обратите внимание, что Wolfram Alpha, похоже, не распознает BSTчасовой пояс.

Дриззт
источник
как быстро найти коды часовых поясов?
Хендри
@hendry Это крутая интерактивная карта: timeanddate.com/time/map/#!cities=241
DavidG
1

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

#!/bin/bash
# ig20180122 - displays meeting options in other time zones
# set the following variable to the start and end of your working day
myday="8 20" # start and end time, with one space
# set the local TZ
myplace='America/Sao_Paulo'
# set the most common places
place[1]='America/Toronto'
place[2]='America/Chicago' # Houston as well
place[3]='Europe/Amsterdam'
place[4]='Europe/Dublin'
# add cities using place[5], etc.
# set the date format for search
dfmt="%m-%d" # date format for meeting date
hfmt="+%B %e, %Y" # date format for the header
# no need to change onwards
format1="%-10s " # Increase if your cities are large
format2="%02d "
mdate=$1
if [[ "$1" == "" ]]; then mdate=`date "+$dfmt"`; fi
date -j -f "$dfmt" "$hfmt" "$mdate"
here=`TZ=$myplace date -j -f "$dfmt" +%z  "$mdate"`
here=$((`printf "%g" $here` / 100))
printf "$format1" "Here" 
printf "$format2" `seq $myday` 
printf "\n"
for i in `seq 1 "${#place[*]}"`
do
    there=`TZ=${place[$i]} date -j -f "$dfmt" +%z  "$mdate"`
    there=$((`printf "%g" $there` / 100))
    city[$i]=${place[$i]/*\//}
    tdiff[$i]=$(($there - $here))
    printf "$format1" ${city[$i]}
    for j in `seq $myday`
    do
        printf "$format2" $(($j+${tdiff[$i]}))
    done
    printf "(%+d)\n" ${tdiff[$i]}
done

Вы можете использовать, чтобы проверить разницу во времени сегодня или в будущем:

16:08 $ meet
January 22, 2019
Here       08 09 10 11 12 13 14 15 16 17 18 19 20 
Toronto    05 06 07 08 09 10 11 12 13 14 15 16 17 (-3)
Chicago    04 05 06 07 08 09 10 11 12 13 14 15 16 (-4)
Amsterdam  11 12 13 14 15 16 17 18 19 20 21 22 23 (+3)
Dublin     10 11 12 13 14 15 16 17 18 19 20 21 22 (+2)
16:13 $ meet 05-24
May 24, 2019
Here       08 09 10 11 12 13 14 15 16 17 18 19 20 
Toronto    07 08 09 10 11 12 13 14 15 16 17 18 19 (-1)
Chicago    06 07 08 09 10 11 12 13 14 15 16 17 18 (-2)
Amsterdam  13 14 15 16 17 18 19 20 21 22 23 24 25 (+5)
Dublin     12 13 14 15 16 17 18 19 20 21 22 23 24 (+4)
16:13 $ 

НТН

Юрий Гавронский
источник
фантастический сценарий! уже добавлен в мой набор инструментов, спасибо! Как вы думаете, возможно ли отображать время в столбцах, а не в строках?
Цезарпач
Может быть. Хотя я не вижу в этом смысла.
Юрий Гавронский