我正在运行python 2.7和标准库的pfSense路由器盒上编写脚本,因此我没有pytz或dateutil模块可以使用,并且strptime模块不支持%z。
我需要将来自另一个服务器(不是本地时间)的日期/时间转换为unix时间戳。
是否有一种方法可以将所需的tz偏移量插入到幼稚的结构化时间中,然后将其转换为GMT?
例如,考虑时间2016/08/14 02:15:10 [-0600/1]MDT来自远程服务器。我的TZ是EDT -0400。
如果值来自我的时区,我可以很容易地这样做:
>>> t=datetime.datetime(2016,8,14,2,15,10).timetuple()
>>> print(t)
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=14, tm_hour=2, tm_min=15, tm_sec=10, tm_wday=6, tm_yday=227, tm_isdst=-1)
>>> ts=time.mktime(t)
>>> print(ts)
1471155310.0
我需要一些方法来进行转换,允许我传递时区偏移量(我需要这样的:time.mktime(t,offset=-21600),但当然它不存在)
我已经硬编码了所有东西,因为我可以很容易地获得值,这是我需要帮助的时间操作逻辑。
我还尝试了以下方法:
In strptime %z不工作
>>> time.strptime("20160814 021510 -0600","%Y%m%d %H%M%S %z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/_strptime.py", line 478, in _strptime_time
return _strptime(data_string, format)[0]
File "/usr/local/lib/python2.7/_strptime.py", line 324, in _strptime
(bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y%m%d %H%M%S %z'
除非是我的时区,否则连%Z都不起作用。
>>> time.strptime("20160814 021510 MDT","%Y%m%d %H%M%S %Z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/_strptime.py", line 478, in _strptime_time
return _strptime(data_string, format)[0]
File "/usr/local/lib/python2.7/_strptime.py", line 332, in _strptime
(data_string, format))
ValueError: time data '20160814 021510 MDT' does not match format '%Y%m%d %H%M%S %Z'
但如果在我的时区strptime DOES工作:
>>> time.strptime("20160814 021510 EDT","%Y%m%d %H%M%S %Z")
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=14, tm_hour=2, tm_min=15, tm_sec=10, tm_wday=6, tm_yday=227, tm_isdst=1)
使用%z
作为数字时区只支持python 3.x
,这里是修复python的2.7
而不是使用:
datetime.strptime(t,'%Y-%m-%dT%H:%M %z')
使用timedelta
说明时区,如下所示:
from datetime import datetime,timedelta
def dt_parse(t):
ret = datetime.strptime(t[0:16],'%Y-%m-%dT%H:%M')
if t[18]=='+':
ret+=timedelta(hours=int(t[19:22]),minutes=int(t[23:]))
elif t[18]=='-':
ret-=timedelta(hours=int(t[19:22]),minutes=int(t[23:]))
return ret