【问题标题】:Python astimezone() unexpected resultPython astimezone() 意外结果
【发布时间】:2018-08-31 13:27:04
【问题描述】:

给定一个包含巴黎时区 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>)

我错过了什么?

谢谢

【问题讨论】:

    标签: python datetime


    【解决方案1】:

    不幸的是使用标准datetimetzinfo 参数 对于许多时区,构造函数“不起作用”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 正确处理,它选择了一些随机(嗯,可能是 first 偏移量)与实际时间相关的偏移量。可以说,由于它首先需要正确解释时间,因此无法从时区包中选择正确的时间偏移量。

    该库仅支持两种构建本地化时间的方法。这 首先是使用pytz库提供的localize()方法。 这用于本地化幼稚的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

    【讨论】:

    • 很清楚。一直在寻找这些细节!
    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2017-11-08
    • 2015-11-03
    相关资源
    最近更新 更多