如何将带时区偏移的时间戳字符串转换为本地时间?

9 投票
3 回答
11419 浏览
提问于 2025-04-16 01:33

我正在尝试把一个字符串格式的时间戳转换成一个正确的日期时间对象。我的问题是,这个时间戳有一个时区偏移,而我做的所有尝试似乎都没有成功。

最终,我想把这个字符串时间戳转换成我电脑所在时区的日期时间对象。

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

3 个回答

0

这里有一个标准库的解决方案:

>>> 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

注意:fromtimestamp() 这个方法可能会出问题,特别是如果你所在的地方在过去(比如2010年)有不同的UTC时区偏移,并且你的平台没有使用历史时区数据库。要解决这个问题,你可以使用 tzlocal.get_localzone(),这样可以获取一个 pytz 的时区信息对象,代表你所在的本地时区。pytz 提供了一种便捷的方式来访问时区数据库:

>>> 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'
5

看起来 datetime.datetime.strptime(d, '%a, %d %b %Y %H:%M:%S %z') 应该可以正常工作,但根据这个错误报告,在处理 %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)
10

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)

撰写回答