python - hôtes distants fuseau horaire vs locale
Question
Je construis une interface web pour la surveillance à distance des journaux,
avoir à gérer environ 10 différents endroits géographiques que je suis tombé sur le 3 hellhound headed certains d'entre vous ont déjà.
Est-il possible d'obtenir à partir d'une variable shell HPUX à distance les informations à distance suivante:
- zoneinfo (Pays / Ville)
- UTC + offset (je peux facilement obtenir ce à partir du zoneinfo)
Jusqu'à présent, le mieux que je puisse obtenir est le système d'exploitation fuseau horaire abrégé (Est-ce suffisant pour traverser le temps itérativement à distance avec une collection de pytz.common_timezones statiquement et convertir inverse les zones en Pays abrégées / Ville ou je vais complètement dans le mauvais sens?)
Je peux facilement obtenir le décalage après avoir obtenu la Ville / Pays (que j'ai pas)
datetime.now(pytz.timezone('Asia/Dili')).strftime('%Z %z')
'TLT 0900'
- get fuseau horaire abrégé à distance,
(Linux a beaucoup plus sain d'esprit
grep "ZONE=" /etc/sysconfig/clock
sortie comme,
ZONE = "Europe / Londres"
tandis que HP-UX / etc / utilisations TIMEZONE comme
abrégé timezones
TZ = CAT-2
J'utiliser echo $ TZ qui génèrerait un peu de données plus utiles comme CAT-2, mais certains HP-Uxes à distance ne sont même pas configuré ainsi me forcer à compter à la date RFC822 ambiguë,
date +%z
CAT
Je l'ai regardé à la fois dans pytz, datetime.datetime, email.Utils mais étant donné qu'il est un ne peut faire convertir directement de temps en abrégé dans le zoneinfo Pays / Ville (pytz permet au contraire)
devrais-je simplement rayer cette quête de Don Quichotte le fuseau horaire à distance Auto découverte et
il suffit d'ajouter une liste déroulante Ville / Pays en acceptant l'entrée d'utilisateur l'enregistrement de l'hôte distant?
EDIT (solution partielle)
la construction sur la réponse Pennington @ Mike
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)
La solution
Vous devriez être en mesure de trouver votre décalage GMT comme ça ...
En décalage GMT, sans tenir compte DST
(time.localtime()[3] - time.localtime()[8]) - time.gmtime()[3]
Je suis dans le temps Central (GMT - 6). Donc, ce rendement -6
sur mon système
En décalage GMT, y compris la rémunération de l'heure d'été
(time.localtime()[3]) - time.gmtime()[3]
Cela donne -5
sur mon système.
Il est probablement plus facile d'aller avec la deuxième option et l'utiliser pour convertir ces temps de HPUX locales en GMT; essoreuse puis avec pytz
les besoins.
EDIT
Si vous travaillez avec une représentation de texte à distance (non GMT) TimeStamps, il est probablement plus facile de travailler directement avec datetime objets ... Je n'ai pas HPUX à portée de main, mais je suppose que la chaîne de date est semblable à mon système de compression debian.
>>> 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'
>>>