Я создаю веб-интерфейс для мониторинга удаленных журналов,
чтобы управлять примерно 10 различными географическими точками, я столкнулся с 3-мя возглавляемыми аддонами, которые у вас уже есть.
Есть ли способ получить от удаленной оболочки оболочки HPUX следующую удаленную информацию:
Пока лучшее, что я могу получить, это сокращенный часовой пояс 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)
Вы можете найти свое смещение GMT как это...
(time.localtime()[3] - time.localtime()[8]) - time.gmtime()[3]
Я нахожусь в центральном времени (GMT-6), поэтому это дает -6
в моей системе.
(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'
>>>