Python -Remote Hosts TimeZone vs Local
質問
リモートログ監視用のWebフロントエンドを構築しています。
約10の異なる地理的場所を管理する必要があります。
リモートHPUXシェル変数から取得する方法はありますか?
- ZoneInfo(カントリー/シティ)
- UTC +オフセット(Zoneinfoから簡単にこれを入手できます)
これまでに私が得ることができるのは、OSの短縮タイムゾーンです(これは、静的に構築されたpytz.common_timezonesコレクションでリモート時間を繰り返し渡るのに十分です。 ))
田舎/都市を手に入れた後、簡単にオフセットを取得できます(私はしていません)
datetime.now(pytz.timezone('Asia/Dili')).strftime('%Z %z')
「TLT +0900」
- リモートの短縮タイムゾーンを取得し、
(Linuxにははるかに正気です
grep "ZONE=" /etc/sysconfig/clock
のような出力、
ゾーン= "ヨーロッパ/ロンドン"
hp-ux /etc /timezoneは略語されたタイムゾーンを使用します
TZ = CAT-2
CAT-2のようなもう少し有用なデータを出力するEcho $ TZを使用しますが、一部のリモートHP-Xはこれを構成していないため、曖昧なRFC822日付に頼らざるを得ません。
date +%z
猫
私は両方をPytz、datetime.datetime、email.utilsを調べましたが、それが省略時間からZoneinfo国/都市への直接変換できることを考えると(pytzは反対を許します)
リモートホストを登録するユーザー入力を受け入れるときに、リモートタイムゾーンを自動化するこのドンキホーテクエストをスクラッチし、カントリー/シティドロップダウンリストを追加する必要がありますか?
編集(部分的な解決策)
@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オフセットを見つけることができるはずです...
GMTオフセットとして、DSTを無視します
(time.localtime()[3] - time.localtime()[8]) - time.gmtime()[3]
私は中央時間(gmt -6)ですので、これは利回りです -6
私のシステムで。
DST補償を含むGMTオフセットとして
(time.localtime()[3]) - time.gmtime()[3]
これは利回りです -5
私のシステムで。
おそらく2番目のオプションを使用して、それを使用してそれらのローカルHPux時間をGMTに変換するのが最も簡単です。それからマングル pytz
要求に応じ。
編集
リモート(GMT以外の)タイムスタンプのテキスト表現を使用している場合、おそらくDateTimeオブジェクトで直接作業する方が簡単です...私はHPUXを手にしていませんが、日付文字列は私に似ていると思いますDebian Squeezeシステム。
>>> 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'
>>>