为朴素日期时间添加时区偏移(ISO 8601格式)

0 投票
2 回答
2795 浏览
提问于 2025-04-17 21:51

我需要把一系列没有时区信息的日期时间转换成它们对应的本地时区。本地时区的信息是以ISO8601格式单独存储的,比如说'-0800'表示太平洋标准时间(PST)。

我试过用一个新的日期时间来替换原来的,添加时区偏移量:

>>>utc_time 
datetime.datetime(2014, 1, 24, 0, 32, 30, 998654)
>>>tz_offset
u'-0800'
>>>local_time = utc_time.replace(tzinfo=tz_offset)
*** TypeError: tzinfo argument must be None or of a tzinfo subclass, not type 'unicode'

还尝试过使用pytz库的localize()方法,但这需要先调用timezone():

>>>timezone(tz_offset)
*** UnknownTimeZoneError: '-0800'

*关于这个步骤的文档在这里:http://pytz.sourceforge.net/#localized-times-and-date-arithmetic

有没有什么建议可以让这些时区偏移量正常工作?

*类似的问题在这里这里,不过我觉得用的是不同的格式。

2 个回答

1

根据错误信息的提示,你需要一个 tzinfo 的子类,也就是一个 tzinfo 对象。这个对象是通过 pytz.timezone 从时区字符串中返回的,但它不理解你提供的偏移格式。

这里有一个和你问题相关的讨论帖,里面链接了一个 谷歌应用引擎的应用,也提供了一些源代码。如果你需要的话,这里有一个简单的例子。

class NaiveTZInfo(datetime.tzinfo):

    def __init__(self, hours):
        self.hours = hours

    def utcoffset(self, dt):
        return datetime.timedelta(hours=self.hours)

    def dst(self, dt):
        return datetime.timedelta(0)

    def tzname(self, dt):
        return '+%02d' % self.hours

要处理你提供的偏移格式,你需要自己编写解析这个格式的逻辑。

>>> t = NaiveTZInfo(-5)
>>> u = datetime.datetime(2014, 1, 24, 0, 32, 30, 998654)
>>> v = u.replace(tzinfo=t)
>>> str(v)
'2014-01-24 00:32:30.998654-05:00'
2

同一个时区在不同的日期可能会有不同的UTC偏移时间。建议使用时区名称,而不是直接使用字符串形式的UTC偏移量:

import datetime
import pytz # $ pip install pytz

utc_time = datetime.datetime(2014, 1, 24, 0, 32, 30, 998654)
utc_dt = utc_time.replace(tzinfo=pytz.utc) # make it timezone aware
pc_dt = utc_dt.astimezone(pytz.timezone('America/Los_Angeles')) # convert to PST

print(pc_dt.strftime('%Y-%m-%d %H:%M:%S.%f %Z%z'))
# -> 2014-01-23 16:32:30.998654 PST-0800

撰写回答