1

我正在构建一个用于远程日志监控的 Web 前端,
必须管理大约 10 个不同的地理位置,我遇到了你们中的一些人已经拥有的 3 头地狱犬。

有什么方法可以从远程 HPUX shell 变量中获取以下远程信息:

  • zoneinfo(国家/城市)
  • UTC + 偏移量(我可以从 zoneinfo 轻松获得)

到目前为止,我能得到的最好的是操作系统缩写的时区(这是否足以通过静态构建的 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,但考虑到直接从缩写时间转换为 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)
4

1 回答 1

3

您应该能够像这样找到您的 GMT 偏移量...

作为 GMT 偏移量,忽略 DST

(time.localtime()[3] - time.localtime()[8]) - time.gmtime()[3]

我在中央时间(格林威治标准时间 - 6)所以,这会-6在我的系统上产生。

作为 GMT 偏移量,包括 DST 补偿

(time.localtime()[3]) - time.gmtime()[3]

-5在我的系统上产生。

使用第二个选项并使用它将那些本地 HPUX 时间转换为 GMT 可能是最简单的;然后pytz根据需要进行处理。

编辑

如果您正在使用远程(非 GMT)时间戳的文本表示,直接使用 datetime 对象可能更容易......我没有 HPUX,但我假设日期字符串类似于我的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'
>>>
于 2011-04-27T12:22:02.213 回答