Python datetime.combine with timezone与datetime.now with timezone不同

Python datetime.combine with timezone与datetime.now with timezone不同,python,datetime,timezone,pytz,Python,Datetime,Timezone,Pytz,在以下代码中: from datetime import datetime import pytz EDT = pytz.timezone('US/Eastern') d1 = datetime.now(tz=EDT) d2 = datetime.combine(d1.date(), d1.time(), tzinfo=EDT) 为什么d1和d2显示不同的时区信息 >> d1 datetime.datetime(2021, 4, 8, 7, 0, 44, 316514, tz

在以下代码中:

from datetime import datetime
import pytz

EDT = pytz.timezone('US/Eastern')

d1 = datetime.now(tz=EDT)

d2 = datetime.combine(d1.date(), d1.time(), tzinfo=EDT)
为什么d1和d2显示不同的时区信息

>> d1
datetime.datetime(2021, 4, 8, 7, 0, 44, 316514, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)
>d1
datetime.datetime(2021,4,8,7,0,44316514,tzinfo=)
>d2
datetime.datetime(2021,4,8,7,0,44316514,tzinfo=)

使用
datetime.combined
时,如何获得与
datetime.now相同的datetime?

datetime.now
使用
pytz
时区对象有效地转换(本地化)您的datetime-来自:

如果tz不是None,则它必须是tzinfo子类的实例,并且 当前日期和时间将转换为tz的时区

他不这样做。这就好像您要编写类似于
datetime(2020,1,1,tzinfo=pytz.timezone('US/Eastern'))
——实际上没有将时区调整到提供的日期/时间。有关更多背景信息,请参见和

使用
pytz
获取
d2
的正确方法是

d2 = EDT.localize(datetime.combine(d1.date(), d1.time()))
如果使用
dateutil
zoneinfo
(Python 3.9+)中的时区对象,则不会出现此类问题:

d2 = EDT.localize(datetime.combine(d1.date(), d1.time()))
from datetime import datetime
from zoneinfo import ZoneInfo

EDT = ZoneInfo('US/Eastern')
d1 = datetime.now(tz=EDT)
d2 = datetime.combine(d1.date(), d1.time(), tzinfo=EDT)

# d1
# Out[75]: datetime.datetime(2021, 4, 8, 7, 57, 18, 309209, tzinfo=zoneinfo.ZoneInfo(key='US/Eastern'))

# d2
# Out[76]: datetime.datetime(2021, 4, 8, 7, 57, 18, 309209, tzinfo=zoneinfo.ZoneInfo(key='US/Eastern'))

# d1 == d2
# Out[77]: True