如何强制pytz使用当前的标准时区?

问题描述

请考虑以下内容

from datetime import datetime

import pytz


new_years_in_new_york = datetime(
    year=2020,month=1,day=1,hour=0,minute=0,tzinfo = pytz.timezone('US/Eastern'))

我现在有一个日期时间对象,代表纽约的1月1日午夜。奇怪的是,如果我使用pytz将其转换为UTC,我将得到几分钟的奇异日期时间:

new_years_in_new_york.astimezone(pytz.utc)
# datetime.datetime(2020,1,4,56,tzinfo=<UTC>)

请注意,纽约时间午夜(pytz)在世界标准时间为 4:56 。在堆栈溢出的其他地方,我了解到这是因为pytz uses your /usr/share/zoneinfo数据在标准化之前使用了本地平均时间来说明时区。可以在这里显示

pytz.timezone('US/Eastern')
# <DstTzInfo 'US/Eastern' LMT-1 day,19:04:00 STD>

看到LMK-1 day,19:04:00 STD吗?那是本地平均时间偏移,不是我想要的偏移,这是夏令时期间的美国/东部 not

有没有一种方法可以强制pytz根据当前日期使用当前标准的偏移量集?在新年2020年,它应该只是UTC-5。如果我提供的日期是夏令时,则需要UTC-4。我对pytz为什么在2020年之前使用基于LMT的偏移量感到困惑。

解决方法

>>> new_years_in_new_york
datetime.datetime(2020,1,tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day,19:04:00 STD>)

请注意该日期时间的奇数偏移量。您没有正确创建此日期时间。

该库仅支持构建本地化时间的两种方式。的 首先是使用pytz库提供的localize()方法。 这用于本地化没有时区的原始日期时间(datetime 信息):

>>> loc_dt = eastern.localize(datetime(2002,10,27,6,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'

不幸的是,使用标准tzinfo的{​​{1}}参数 pytz的构造函数在许多时区都“不起作用”。

datetime

http://pytz.sourceforge.net/#localized-times-and-date-arithmetic