我需要将一系列天真的日期时间转换为本地的tz。本地tz作为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 to localize(),这需要先调用timezone():
>>>timezone(tz_offset)
*** UnknownTimeZoneError: '-0800'
此步骤的* doc:http://pytz.sourceforge.net/#localized-times-and-date-arithmetic
有关使这些补偿有效的建议吗?
*类似问题here,但我认为使用的格式不同。
答案 0 :(得分:2)
同一时区在不同日期可能有不同的utc偏移量。使用时区名称而不是字符串utc offset:
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
答案 1 :(得分:1)
正如错误消息所述,您需要一个tzinfo
子类(即tzinfo object),pytz.timezone
从时区字符串返回,但它不了解您提供的偏移格式
Another relevant thread to your problem,链接到此google app engine application,它还提供了一些源代码。如果你愿意,这是一个快速而天真的例子。
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'