Python: zona horaria de hosts remotos vs locales
Pregunta
Estoy construyendo una interfaz web para monitoreo de registros remotos,
Tener que manejar unas 10 ubicaciones geográficas diferentes que he llegado a los 3 encabezados Hell Hell Hound algunos de ustedes que ya tienen.
¿Hay alguna forma de obtener de una variable remota de shell HPUX la siguiente información remota:
- ZoneInfo (País/Ciudad)
- UTC + Offset (puedo obtener esto fácilmente desde el ZoneInfo)
Hasta ahora, lo mejor que pude obtener es la zona horaria abreviada del sistema operativo (¿es esto suficiente para cruzar el tiempo remoto con una colección Pytz.common_Timezones de iteración y convertir inversamente las zonas abreviadas en el país/ciudad o estoy yendo por completo por el camino equivocado? )
Puedo obtener fácilmente la compensación después de obtener el país/ciudad (que no lo he hecho)
datetime.now(pytz.timezone('Asia/Dili')).strftime('%Z %z')
'TLT +0900'
- Obtenga zona horaria abreviada remota,
(Linux tiene mucho más sano
grep "ZONE=" /etc/sysconfig/clock
salida como,
Zone = "Europa/Londres"
mientras que HP-UX /ETC /TimeZone usa zonas horarias abreviadas como
TZ = CAT-2
Usaría Echo $ TZ, que generaría datos un poco más útiles como CAT-2, pero algunos HP-UXES remotos ni siquiera tienen esto configurado, lo que me obliga a confiar en la fecha ambigua de RFC822,
date +%z
GATO
He buscado a Pytz, Datetime.datetime, correo electrónico.
¿Debo rascar esta búsqueda de Don Quijote de autodescubrir la zona horaria remota y simplemente agregar una lista desplegable de país/ciudad al aceptar la entrada del usuario que registra el host remoto?
Editar (solución parcial)
construyendo en @Mike Pennington Respuesta
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)
Solución
Deberías poder encontrar tu compensación GMT así ...
Como compensación de GMT, ignorando el DST
(time.localtime()[3] - time.localtime()[8]) - time.gmtime()[3]
Estoy en la hora central (GMT - 6) Entonces, esto produce -6
en mi sistema.
Como compensación de GMT, incluida la compensación DST
(time.localtime()[3]) - time.gmtime()[3]
Esto rendimiento -5
en mi sistema.
Probablemente sea más fácil ir con la segunda opción y usarla para convertir esos tiempos HPUX locales en GMT; luego mangle con pytz
según sea necesario.
EDITAR
Si está trabajando con una representación de texto de marcas de tiempo remotas (no GMT), probablemente sea más fácil trabajar directamente con objetos de fecha y hora ... No tengo HPUX a mano, pero supondré que la cadena de fecha es similar a mi Sistema de Squeeze 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'
>>>