python - часовой пояс удаленных хостов против локального

1

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

Есть ли способ получить от удаленной оболочки оболочки HPUX следующую удаленную информацию:

  • zoneinfo (Страна/Город)
  • UTC + offset (я могу легко получить это из zoneinfo)

Пока лучшее, что я могу получить, это сокращенный часовой пояс OS (достаточно ли этого, чтобы итеративно пересекать отдаленное время со статически построенной коллекцией pytz.common_timezones и наоборот конвертировать сокращенные зоны в страну/город, или я полностью ошибаюсь?)

Я могу легко получить смещение после получения страны/города (чего у меня нет)

datetime.now(pytz.timezone('Asia/Dili')).strftime('%Z %z')

'TLT +0900'

  • получить удаленный сокращенный часовой пояс,

(Linux имеет гораздо более разумные

grep "ZONE=" /etc/sysconfig/clock  

вывод, например,
ZONE = "Europe/London"
в то время как HP-UX/etc/TIMEZONE использует сокращенные временные интервалы, например, TZ = CAT-2

Я бы использовал echo $TZ, который выдавал бы более полезные данные, такие как CAT-2, но некоторые удаленные HP-UX даже не настроили это, заставляя меня полагаться на неоднозначную дату RFC822,

date +%z  

КПП

Я посмотрел как на pytz, так и на datetime.datetime, email.Utils, но, учитывая, что нет, можно сделать прямое преобразование из сокращенного времени в зонуinfo Country/City (pytz позволяет противоположное)
должен ли я просто поцарапать этот квест Дон Кихота для автоматического обнаружения удаленного часового пояса и просто добавьте раскрывающийся список Страна/Город, когда принимаете вход пользователя, регистрирующий удаленный хост?

EDIT (частичное решение)

на основе ответа @Mike Pennington

from datetime import datetime as dt
from datetime import timedelta as td
from dateutil.relativedelta import *
from email.Utils import mktime_tz, parsedate_tz

hpux_remote_date = 'Thu Apr 28 18:09:20 TLT 2011'
utctimestamp = mktime_tz(parsedate_tz( hpux_remote_date ))  

hpux_dt = dt.fromtimestamp( utctimestamp )
delta_offset = relativedelta(dt.utcnow(), hpux_dt)

hpux_utc = hpux_dt + delta_offset

# Sanity checking to ensure we are correct...
hpux_dt
datetime.datetime(2011, 4, 28, 18, 9, 20)
hpux_utc
datetime.datetime(2011, 4, 28, 9, 9, 22, 229148)
  • 0
    что именно вы спрашиваете? Это вопрос интерфейса пользователя? Вопрос о том, как извлечь часовые пояса из отметок времени? Или, может быть, как определить географическое местоположение сервера?
  • 0
    «Преобразование из сокращенного времени в zoneinfo Country / City невозможно» - это также не совсем возможно. Что будет «+0100»? Это «Европа / Лондон» летом или «Европа / Берлин» или «Европа / Париж» зимой?
Показать ещё 5 комментариев
Теги:
pytz
hp-ux

1 ответ

3
Лучший ответ

Вы можете найти свое смещение GMT ​​как это...

В качестве смещения GMT без учета DST

(time.localtime()[3] - time.localtime()[8]) - time.gmtime()[3]

Я нахожусь в центральном времени (GMT-6), поэтому это дает -6 в моей системе.

В качестве смещения по GMT, включая компенсацию DST

(time.localtime()[3]) - time.gmtime()[3]

Это дает -5 в моей системе.

Вероятно, проще всего перейти со вторым вариантом и использовать его для преобразования этих локальных часов HPUX в GMT; затем калечить с pytz по мере необходимости.

ИЗМЕНИТЬ

Если вы работаете с текстовым представлением удаленных (не GMT) временных меток, возможно, проще работать непосредственно с объектами datetime... У меня нет HPUX, но я предполагаю, что строка даты подобно моей системе сжимания дебиана.

>>> from datetime import datetime as dt
>>> from datetime import timedelta as td
>>> # using os.popen() to simulate the results of a HPUX shell 'date'...
>>> # substitute the real HPUX shell date string in hpux_date
>>> hpux_date = os.popen('date').read().strip()
>>> hpux_dt = dt.strptime(hpux_date, '%a %b %d %H:%M:%S %Z %Y')
>>> # Rounding to the nearest hour because there *will* be slight delay
>>> # between shell string capture and python processing
>>> offset_seconds = ((dt.utcnow() - hpux_dt).seconds//3600)*3600
>>> hpux_gmt = hpux_dt + td(0,offset_seconds)
>>> # Sanity checking to ensure we are correct...
>>> hpux_gmt
datetime.datetime(2011, 4, 27, 17, 21, 58)
>>> hpux_dt
datetime.datetime(2011, 4, 27, 12, 21, 58)
>>> hpux_date
'Wed Apr 27 12:21:58 CDT 2011'
>>>
  • 0
    Спасибо, Майк, ты получил мой первый вопрос в первый раз. Я проголосовал за ответ, но не могли бы вы разработать? (У меня есть Python на моем RHEL-сервере, а не на HP-UX, поэтому мне нужно проанализировать некоторые выходные данные даты и времени и преобразовать их локально в что-то вроде UTC). В вашем примере обрабатываются почасовые различия в тот же день, но наивный часовой пояс прост, что если местные тз в разные дни? Разве мне не нужно все время конвертировать в UTC и локализовать их?
  • 0
    @stack_zen, смотрите мое редактирование выше ... Я думаю, что это должно решить проблему. Это также относится к системам с другой календарной датой
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню