Python astimezone()意外结果

发布于 2021-01-29 15:02:45

给定一个变量,该变量包含巴黎时区的日期时间2000-01-01 00:01(冬季afaik中为UTC + 2):

datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone('Europe/Paris'))

我希望转换为UTC会导致日期时间为1999-12-31 22:01,但是却得到了:

datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone('Europe/Paris')).astimezone(pytz.utc)
datetime.datetime(1999, 12, 31, 23, 52, tzinfo=<UTC>)

我想念什么?

谢谢

关注者
0
被浏览
87
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    不幸的是 ,在许多时区使用tzinfo标准datetime构造函数的参数“不起作用” pytz

    >>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt)
    '2002-10-27 12:00:00 LMT+0020'
    

    但是对于没有夏令时转换的时区来说是安全的,例如UTC:

    >>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=pytz.utc).strftime(fmt)
    '2002-10-27 12:00:00 UTC+0000'
    

    您会注意到:

    >>> datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone('Europe/Paris'))
    datetime.datetime(2000, 1, 1, 0, 1, tzinfo=<DstTzInfo 'Europe/Paris' LMT+0:09:00 STD>)
    

    “ LMT + 0:09:00 STD”…?! 那是历史的偏移,不是当前的标准。

    pytz不能正确处理传回的时区捆绑包(包含永远的所有历史偏移量)datetime,它选择一些随机的(可能是 第一个
    可能的)偏移量,而不是与实际时间相关的偏移量。可以说,由于它需要首先正确地解释时间,因此不能从时区束中选择正确的时间偏移。

    该库仅支持构建本地时间的两种方式。第一种是使用库localize()提供的方法pytz。这用于本地化天真datetimedatetime没有时区信息):

    >>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
    >>> print(loc_dt.strftime(fmt))
    2002-10-27 06:00:00 EST-0500
    

    建立本地化时间的第二种方法是使用标准astimezone()方法转换现有的本地化时间:

    >>> ams_dt = loc_dt.astimezone(amsterdam)
    >>> ams_dt.strftime(fmt)
    '2002-10-27 12:00:00 CET+0100'
    

    http://pytz.sourceforge.net



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看