我正在尝试将格式 20151021 | 133102 [-0400/1] 的时间戳转换为纪元时间。
我希望代码能够运行,无论其运行的机器的本机时区如何,并且能够识别DST,因此代码将通过交换机运行到/从DST运行。我需要在Python 2.7.x下运行代码(理想情况下只使用标准库模块,因此代码是可移植的。)
在浪费了下午的谷歌搜索后,我能做的最好的是:
time.mktime(time.strptime('20151021|133102','%Y%m%d|%H%M%S'))`
不允许我合并偏移量或夏令时标志。
我也尝试了以下内容:
time.mktime(time.strptime('20151021|133102-4000','%Y%m%d|%H%M%S%z'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/_strptime.py", line 467, in _strptime_time
return _strptime(data_string, format)[0]
File "/usr/lib/python2.7/_strptime.py", line 317, in _strptime
(bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y%m%d|%H%M%S%z'
但似乎strptime不允许偏移。
strptime支持:
time.mktime(time.strptime('20151021|133102EDT','%Y%m%d|%H%M%S%Z'))
但这意味着我需要以某种方式将偏移量转换为时区缩写,这似乎有点愚蠢 - 并且可能会根据代码的运行位置产生错误。
我不敢相信这不是更直接的,因为常规这个问题应该是。非常感谢任何帮助。
答案 0 :(得分:0)
有两个步骤:
将时间字符串解析为日期/时间对象,例如How to parse dates with -0400 timezone string in python?和 Parsing date with timezone from an email?
import time
time_string = "20151021|133102-0400"
tt = time.strptime(time_string[:15], "%Y%m%d|%H%M%S")
hours, minutes = divmod(int(time_string[16:]), 100)
utc_offset = (hours * 60 + minutes) * 60
if time_string[15] == '-':
utc_offset = -utc_offset
获得自大纪元以来的秒数#34;对应于日期/时间对象:Converting datetime.date to UTC timestamp in Python
from calendar import timegm
posix_timestamp = timegm(tt) - utc_offset
我希望代码能够运行,无论其运行的机器的本机时区如何
time.mktime()
期望当地时间作为输入。如果输入时间字符串不代表本地时间,请不要使用它。如果时间字符串具有utc偏移量(mktime()
可能会因模糊时间或过去/未来日期产生错误结果),您也不应该使用它。
答案 1 :(得分:-1)
首先,您将数字标识为字符串。我所做的是将字符串标识为整数,然后使用datatime转换为epoche时间。
您需要删除未标识为整数的符号,以便在上面列出以下数字,但下面的代码适用于python 2.7
import datetime
conversion = datetime.datetime.fromtimestamp(int("20151021")).strftime('%Y-%m-%d %H:%M:%S')
print (conversion)
答案 2 :(得分:-1)
怪异。适用于Python3,但不适用于Python2
>>> time.mktime(time.strptime('20151021|133102-0400', '%Y%m%d|%H%M%S%z'))
1445452262.0