Linux: надежный способ получить часовой пояс в виде Континент/Город

Это твоя идея? Быстрый грязный пример:

$ sort -V -t, -k 1 lookup.csv > lookup_sorted.csv 
$ sort -V -t, -k 10 section_ne.csv > section_ne_sorted.csv 
$ join -1 10 -2 1 -t, section_ne_sorted.csv lookup_sorted.csv 
5.6,X,172.29.7.227,172.29.7.227,,,,N-D,,,a6gpaa56.175,,,,,,,,,,,,,,56.153
5.6,X,is181,10.5.5.181,,,,N-D,,,a6gpaa56.453,,,,,,,,,,,,,,56.153
5.6,X,Detected_at_10.5.5.121,10.5.5.121,,,,N-A,,,a6gpaa56.462,,,,,,,,,,,,,,56.153
5.6,X,eyup,10.5.5.91,,,,C-A,,,a6gpaa56.557,,,,,,,,,,,,,,56.153
5.6,X,is107,10.5.5.107,,,,N-A,,,a6gpaa56.561,,,,,,,,,,,,,,56.153
5.6,X,is172,10.5.5.172,,,,N-F,,,a6gpaa56.561,,,,,,,,,,,,,,56.153
5.6,X,is179,10.5.5.179,,,,N-D,,,a6gpaa56.561,,,,,,,,,,,,,,56.153
join: file 2 is not in sorted order
join: file 1 is not in sorted order
1
13.02.2020, 17:07
4 ответа

Вы можете получить часовой пояс из /etc/timezoneфайла:

cat /etc/timezone
2
28.04.2021, 23:23
timedatectl status | awk '/zone/ {print $3}'
3
28.04.2021, 23:23

Используйте tzselect на современных Linux-серверах. запустите tzselect и начните детализировать подсказки.

~]# tzselect 
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
 1) Africa
 2) Americas
 3) Antarctica
 4) Arctic Ocean
 5) Asia
 6) Atlantic Ocean
 7) Australia
 8) Europe
 9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 

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

0
28.04.2021, 23:23

Названия географических часовых поясов являются одновременно и абстракцией, и удобством. Под капотом файлы данных часового пояса представляют собой двоичные файлы, в которых перечислены смещения, разрывы и изменения летнего времени, но не местоположение (, даже если имя файла указывает на это, отсюда и проблема с/etc/localtime). Существует сопоставление местоположения и даты со смещением часового пояса, но это не 1 :1 — например, учитывая вывод date, вы не можете легко и детерминистически определить используемое географическое местоположение (. ] но вы можете вычислить набор совместимых на текущую дату; или вы могли бы, приложив некоторые усилия, проверить более ранние даты на наличие разрывов, чтобы вывести местоположение ).

Существует основной список имен зон , а файлы определения часовых поясов выглядят так:

# Zone  NAME            GMTOFF  RULES   FORMAT  [UNTIL]
Zone    Europe/London   -0:01:15 -      LMT     1847 Dec  1 0:00s
                         0:00   GB-Eire %s      1968 Oct 27
                         1:00   -       BST     1971 Oct 31 2:00u
                         0:00   GB-Eire %s      1996
                         0:00   EU      GMT/BST
Link    Europe/London   Europe/Jersey
Link    Europe/London   Europe/Guernsey
Link    Europe/London   Europe/Isle_of_Man

При создании двоичного Europe/Londonфайла указанные правила обрабатываются для создания временных правил (временных меток, где что-то изменяется, проверяется с помощью zdump -v Europe/London), а соответствующие местоположения получают псевдонимы. Содержимое файла localtimeили вывод dateиз любого из вышеуказанных мест будут неразличимы.

Абстракция позволяет обрабатывать юридические изменения во времени, например

# TZ=Europe/Andorra date -d "Aug 31 1984"
Fri Aug 31 00:00:00 CET 1984

TZ=Europe/Andorra date -d "Aug 31 1985"
Sat Aug 31 00:00:00 CEST 1985

(Андорра не входит в ЕС, но с 1985 года следует правилам перехода на летнее время в ЕС)

/etc/localtime— это (двоичный файл данных часового пояса ), в Debian по соглашению он должен быть символической ссылкой на именованный файл географического часового пояса в соответствии с ''Stretch''(9 )и ''Buster''(10)localtimeсправочных страниц:

The /etc/localtime file configures the system-wide timezone of the local system that is used by applications for presentation to the user. It should be an absolute or relative symbolic link pointing to /usr/share /zoneinfo/, followed by a timezone identifier such as "Europe/Berlin" or "Etc/UTC". The resulting link should lead to the corresponding binary tzfile(5) timezone data for the configured timezone.

Because the timezone identifier is extracted from the symlink target name of /etc/localtime, this file may not be a normal file or hardlink.

Если это так:

if [ -L /etc/localtime ]; then
  IFS=/ read -a TZFILE < <(readlink -f /etc/localtime)
  printf -v TZNAME "%s/%s\n" ${TZFILE[-2]} ${TZFILE[-1]}
  echo $TZNAME
fi

В более ранних версиях (или если кто-то не следил за документацией ), это была копия файла данных часового пояса. Итак, чтобы убедиться, что /etc/localtimeи /etc/timezoneсовпадают, вам нужно сравнить их:

$ diff -s /etc/localtime /usr/share/zoneinfo/`cat /etc/timezone`
Files /etc/localtime and /usr/share/zoneinfo/America/New_York are identical

Если вам нужно работать в обратном направлении,или быть тщательным:

read CHECK file < <(sha256sum /etc/localtime)
while read sum file; do 
  [[ "$sum" == "$CHECK" ]] && printf "%s\n" "$file"
done < <(find /usr/share/zoneinfo/ -type f |xargs sha256sum)

Это не совсем переносимый ответ. (POSIX не определяет и не требует этих длинных имен , они исходят от ICANN/IANA ), и вы используете systemdкоманды на этих версиях Debian.

1
28.04.2021, 23:23

Теги

Похожие вопросы