将字符串时间戳(带有时区偏移量)转换为本地时间。 。 ?蟒蛇

时间:2010-07-20 03:34:48

标签: python datetime timezone

我正在尝试将字符串时间戳转换为正确的datetime对象。我遇到的问题是存在时区偏移,我所做的一切似乎都不起作用。

最终我想将字符串时间戳转换为我的机器时区中的日期时间对象。

# string timestamp     
date = u"Fri, 16 Jul 2010 07:08:23 -0700"

3 个答案:

答案 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'