代码之家  ›  专栏  ›  技术社区  ›  eumiro

Python:pytz返回不可用

  •  3
  • eumiro  · 技术社区  · 14 年前

    repr() 的目的是返回一个字符串,该字符串可以作为python命令进行计算,并返回相同的对象。不幸的是, pytz 似乎对这个函数不是很友好,尽管它应该很容易,因为 皮茨 实例是通过单个调用创建的:

    import datetime, pytz
    now = datetime.datetime.now(pytz.timezone('Europe/Berlin'))
    repr(now)
    

    datetime.datetime(2010, 10, 1, 13, 2, 17, 659333, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>)
    

    它不能简单地复制到windows上的另一个ipython并进行计算,因为它在 tzinfo 属性。

    有没有简单的方法让它打印出来:

    datetime.datetime(2010, 10, 1, 13, 2, 17, 659333, tzinfo=pytz.timezone('Europe/Berlin'))
    

    'Europe/Berlin' 字符串已在的原始输出中清晰可见 repr() ?

    1 回复  |  直到 14 年前
        1
  •  1
  •   unutbu    14 年前
    import datetime
    import pytz
    import pytz.tzinfo
    
    def tzinfo_repr(self):
        return 'pytz.timezone({z})'.format(z=self.zone)
    pytz.tzinfo.DstTzInfo.__repr__=tzinfo_repr
    
    berlin=pytz.timezone('Europe/Berlin')
    now = datetime.datetime.now(berlin)
    print(repr(now))
    # datetime.datetime(2010, 10, 1, 14, 39, 4, 456039, tzinfo=pytz.timezone("Europe/Berlin"))
    

    请注意 pytz.timezone("Europe/Berlin") 在夏天可能意味着不同于 pytz.timezone("Europe/Berlin")) 在冬天,由于夏令时。所以猴子打了补丁 __repr__ 不是的正确表示 self 永远。但在复制和粘贴到IPython的过程中,它应该可以正常工作(极端情况除外)。


    另一种方法是子类化 datetime.tzinfo :

    class MyTimezone(datetime.tzinfo):
        def __init__(self,zone):
            self.timezone=pytz.timezone(zone)
        def __repr__(self):
            return 'MyTimezone("{z}")'.format(z=self.timezone.zone)
        def utcoffset(self, dt):
            return self.timezone._utcoffset
        def tzname(self, dt):
            return self.timezone._tzname
        def dst(self, dt):
            return self.timezone._dst
    
    berlin=MyTimezone('Europe/Berlin')
    now = datetime.datetime.now(berlin)
    print(repr(now))
    # datetime.datetime(2010, 10, 1, 19, 2, 58, 702758, tzinfo=MyTimezone("Europe/Berlin"))