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