我正在尝试将字符串时间戳转换为正确的datetime对象。我遇到的问题是存在时区偏移,我所做的一切似乎都不起作用。
最终我想将字符串时间戳转换为我的机器时区中的日期时间对象。
# string timestamp
date = u"Fri, 16 Jul 2010 07:08:23 -0700"
答案 0 :(得分:9)
dateutil包非常适合解析日期/时间:
In [10]: date = u"Fri, 16 Jul 2010 07:08:23 -0700"
In [11]: from dateutil.parser import parse
In [12]: parse(date)
Out[12]: datetime.datetime(2010, 7, 16, 7, 8, 23, tzinfo=tzoffset(None, -25200))
最后,要转换为您当地的时区,
In [13]: parse(date).astimezone(YOUR_LOCAL_TIMEZONE)
答案 1 :(得分:5)
看起来datetime.datetime.strptime(d, '%a, %d %b %Y %H:%M:%S %z')
应该有效,但根据this bug report,%z
处理存在问题。所以你可能需要自己处理时区:
import datetime
d = u"Fri, 16 Jul 2010 07:08:23 -0700"
d, tz_info = d[:-5], d[-5:]
neg, hours, minutes = tz_info[0], int(tz_info[1:3]), int(tz_info[3:])
if neg == '-':
hours, minutes = hours * -1, minutes * -1
d = datetime.datetime.strptime(d, '%a, %d %b %Y %H:%M:%S ')
print d
print d + datetime.timedelta(hours = hours, minutes = minutes)
答案 2 :(得分:0)
这是一个stdlib解决方案:
>>> from datetime import datetime
>>> from email.utils import mktime_tz, parsedate_tz
>>> datetime.fromtimestamp(mktime_tz(parsedate_tz(u"Fri, 16 Jul 2010 07:08:23 -0700")))
datetime.datetime(2010, 7, 16, 16, 8, 23) # your local time may be different
另见Python: parsing date with timezone from an email。
注意:如果本地时区在过去(2010)和中具有不同的UTC偏移,如果它在给定平台上不使用历史时区数据库,则fromtimestamp()
可能会失败。要解决此问题,您可以使用tzlocal.get_localzone()
来获取代表当地时区的pytz
tzinfo对象。 pytz
以可移植的方式提供对tz数据库的访问:
>>> timestamp = mktime_tz(parsedate_tz(u"Fri, 16 Jul 2010 07:08:23 -0700"))
>>> import tzlocal # $ pip install tzlocal
>>> str(datetime.fromtimestamp(timestamp, tzlocal.get_localzone()))
'2010-07-16 16:08:23+02:00'