Python - Remote -Gastgeber Timezone gegen lokal
Frage
Ich baue ein Web -Frontend für die Überwachung der Remoteprotokolle.
Ich musste ungefähr 10 verschiedene geografische Orte verwalten, die ich in die 3 -Kopf -Hölle gestoßen habe, die einige von Ihnen bereits haben.
Gibt es eine Möglichkeit, eine Remote -HPUX -Shell -Variable zu erhalten, die folgende Remote -Informationen:
- ZoneInfo (Land/Stadt)
- UTC + Offset (ich kann dies leicht vom ZoneInfo erhalten)
Das Beste, was ich bekommen könnte, ist die abgekürzte OS -Zeitzone (reicht dies aus, um die Fernzeit mit einem staatlich gebauten Pytz -Sammlung iterativ zu überschreiten. Die Sammlung von Pytz.Common_Timezones und umgekehrt die abgekürzten Zonen in Land/Stadt oder ich gehe den falschen Weg? ))
Ich kann leicht den Offset bekommen, nachdem ich das Land/die Stadt bekommen habe (was ich nicht habe)
datetime.now(pytz.timezone('Asia/Dili')).strftime('%Z %z')
'TLT +0900'
- Remote abgekürzte Zeitzone erhalten,
(Linux hat die weitaus vernünftigere
grep "ZONE=" /etc/sysconfig/clock
Ausgabe wie,
Zone = "Europa/London"
Während Hp-UX /etc /timezone abgekürzte Zeitzonen wie verwendet
TZ = CAT-2
Ich würde Echo $ TZ verwenden, das etwas mehr nützliche Daten wie CAT-2 ausgeben würde, aber einige Remote-HP-UXEs haben dies nicht einmal konfiguriert, wodurch mich gezwungen ist, auf das mehrdeutige RFC822-Datum zu stützen.
date +%z
KATZE
Ich habe mich sowohl in Pytz, datetime.datetime, E -Mail.utils gesucht, aber wenn man bedenkt, dass es sich um eine NO -Direkt handelt, die direkt von der abgekürzten Zeit in das Land/die Stadt zoneInfo umgewandelt wird (Pytz erlaubt das Gegenteil)
Sollte ich nur diese Don Quixote -Suche nach automatischer Entdeckung der Remote -Zeitzone kratzen und einfach eine Country/City -Dropdown -Liste hinzufügen, wenn Sie die Benutzereingabe akzeptieren, wenn Sie den Remote -Host registrieren?
Bearbeiten (Teillösung)
Aufbau auf @Mike Pennington Antwort
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)
Lösung
Sie sollten in der Lage sein, Ihren GMT -Offset wie diesen zu finden ...
Als GMT -Offset ignorieren Sie die DST
(time.localtime()[3] - time.localtime()[8]) - time.gmtime()[3]
Ich bin in der zentralen Zeit (GMT - 6). -6
auf meinem System.
Als GMT -Offset, einschließlich DST -Kompensation
(time.localtime()[3]) - time.gmtime()[3]
Dies ergibt -5
auf meinem System.
Es ist wahrscheinlich am einfachsten, die zweite Option zu erreichen und diese lokalen HPUX -Zeiten in GMT umzuwandeln. dann Mangle mit pytz
nach Bedarf.
BEARBEITEN
Wenn Sie mit einer Textdarstellung von Remote (Nicht-GMT-) Zeitstempeln arbeiten, ist es wahrscheinlich einfacher, direkt mit DateTime-Objekten zu arbeiten ... Ich habe HPUX nicht praktisch, aber ich gehe davon aus, Debian Squeeze System.
>>> 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'
>>>