【问题标题】:python - remote hosts timezone vs localpython - 远程主机时区与本地
【发布时间】:2011-08-13 18:46:27
【问题描述】:

我正在构建一个用于远程日志监控的 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="欧洲/伦敦"
而 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)

【问题讨论】:

  • 您要问的是什么?这是一个用户界面问题吗?关于如何从时间戳中提取时区的问题?或者如何确定服务器的地理位置?
  • “从缩写时间转换为 zoneinfo 国家/城市是不可能的” - 这也不太可能。什么是'+0100'?是夏天的“欧洲/伦敦”还是冬天的“欧洲/柏林”或“欧洲/巴黎”?
  • @Bryan Oakley,我非常清楚。他在将 HPUX shell 变量中的数据导出为他可以用作pytz 偏移量的东西时遇到问题
  • @Mike Pennington:好的,但他的问题中唯一实际的问题是“我是否应该解决这个堂吉诃德的问题……然后添加一个国家/城市下拉列表……?”。我认为这个问题可以说得更清楚。
  • 对不起,伙计们,为了设定我的目标,输入了太多信息,我会编辑它,总结一下,我需要一种无缝的方式来使用任何远程信息,这样我就可以获得本地服务器与远程服务器国家/城市和 UTC 偏移量。

标签: python hp-ux pytz zoneinfo


【解决方案1】:

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

作为 GMT 偏移量,忽略 DST

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

我在中部时间 (GMT - 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'
>>>

【讨论】:

  • 感谢 Mike,您第一次收到了我最初的问题。我已经对答案投了赞成票,但你能详细说明一下吗? (我的 RHEL 服务器中有 Python,而不是 HP-UX 的,所以我需要解析一些日期时间输出并将其在本地转换为 UTC 之类的东西)您的示例处理同一天的每小时差异,但时区幼稚,如果远程和本地 tz 在不同的日子?我不需要将所有时间都转换为 UTC 并将它们本地化吗?
  • @stack_zen,请看我上面的编辑...我认为这应该可以解决问题。这也说明了具有不同日历日期的系统
  • hpux_dt = dt.strptime(hpux_date, '%a %b %d %H:%M:%S %Z %Y') 适用于当地时间,但不适用于外星时间,考虑到 %Z是特定于平台的(仅识别 time.tzname 值,加上 UTC 和 GMT)。此外,偏移量计算容易出现时间不同的本地/远程日期时间错误。因此,我轻轻地改写了您的建议(添加了保留缩进的答案),以便在额外进口成本方面更加坚固
  • @stack_zen,谢谢你让我知道......用正则表达式重写来解析所需的信息并不难,但希望这能让你到达你需要去的地方
猜你喜欢
  • 2018-08-03
  • 2018-05-02
  • 1970-01-01
  • 2012-06-05
  • 2018-10-09
  • 2012-11-03
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
相关资源
最近更新 更多