将时区偏移(以ISO 8601格式)添加到无时区的日期时间

24 浏览
0 Comments

将时区偏移(以ISO 8601格式)添加到无时区的日期时间

我需要将一系列的naive datetimes转换为它们的本地时区。本地时区以ISO8601格式单独存储(例如PST的\'-0800\')。\n我尝试用一个新的datetime替换datetime,并添加偏移量:\nutc_time \ndatetime.datetime(2014, 1, 24, 0, 32, 30, 998654)\ntz_offset\nu\'-0800\'\nlocal_time = utc_time.replace(tzinfo=tz_offset)\n*** TypeError: tzinfo的参数必须为None或tzinfo子类的类型,而不是\'unicode\'类型\n我尝试使用pytz的localize()方法,但需要先调用timezone()方法:\ntimezone(tz_offset)\n*** UnknownTimeZoneError: \'-0800\'\n有没有任何建议可以使这些偏移量正常工作?\n*有类似问题在这里,但使用的是不同的格式,我想。

0
0 Comments

问题的出现原因是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',其中-05:00是偏移量。

0
0 Comments

问题:从上述代码中,我们可以看到在将一个无时区信息的datetime对象转换为带有时区信息的datetime对象时,需要添加时区偏移量。但是,同一个时区在不同日期可能具有不同的UTC偏移量。

原因:同一个时区在不同日期可能具有不同的UTC偏移量,因此不能简单地使用字符串UTC偏移量来添加时区信息。

解决方法:使用时区名称而不是字符串UTC偏移量来添加时区信息。可以使用pytz库来获取时区名称,并将其应用于datetime对象。

下面是解决方法的代码示例:

import datetime
import pytz # $ pip install pytz
# 创建一个无时区信息的datetime对象
utc_time = datetime.datetime(2014, 1, 24, 0, 32, 30, 998654)
# 将datetime对象转换为带有时区信息的datetime对象
utc_dt = utc_time.replace(tzinfo=pytz.utc) # 将其设置为UTC时区
# 将带有时区信息的datetime对象转换为特定时区的datetime对象
pc_dt = utc_dt.astimezone(pytz.timezone('America/Los_Angeles')) # 转换为美国洛杉矶时区
# 打印带有时区信息的datetime对象的字符串表示形式
print(pc_dt.strftime('%Y-%m-%d %H:%M:%S.%f %Z%z'))
# -> 2014-01-23 16:32:30.998654 PST-0800

在上述代码中,我们首先创建了一个没有时区信息的datetime对象utc_time。然后,我们使用pytz.utc将其转换为带有UTC时区信息的datetime对象utc_dt。接下来,我们使用astimezone()方法将utc_dt转换为美国洛杉矶时区的datetime对象pc_dt。最后,我们使用strftime()方法将pc_dt的字符串表示形式打印出来,以验证时区信息是否正确添加。

0