Add time zone offset (in ISO 8601 format) to naive datetime
我需要将一系列天真的日期时间转换为它们的本地tz。 本地tz作为ISO8601格式单独存储(例如,用于PST的'-0800')。
我尝试用新的替换日期时间,添加偏移量:
1 2 3 4 5 6 | >>>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():
1 2 | >>>timezone(tz_offset) *** UnknownTimeZoneError: '-0800' |
*此步骤的文档:http://pytz.sourceforge.net/#localized-times-and-date-arithmetic
有关制作这些补偿的建议吗?
*我认为这里有类似的问题,但使用的格式不同。
相同时区在不同日期可能具有不同的utc偏移量。 使用时区名称而不是字符串utc offset:
1 2 3 4 5 6 7 8 9 | 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 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
要处理偏移格式,您必须为您提供的格式编写自己的解析逻辑。
1 2 3 4 5 | >>> 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' |