Python 如何将时区添加到datetime对象?

Python 如何将时区添加到datetime对象?,python,datetime,timezone,Python,Datetime,Timezone,我有一个变量,它从文件中获取日期对象。我的目标是为这个对象添加一个时区,这样它就可以根据当时的日期自动更改时间。因此,我预计在3月至10月的夏季会增加+1小时,在10月至3月的冬季会增加+0小时 dt_object = '20200901-01u30m30s' dt_object = datetime.datetime.strptime(dt_object, '%Y%m%d-%Hu%Mm%Ss') >>>print(dt_object) >>&g

我有一个变量,它从文件中获取日期对象。我的目标是为这个对象添加一个时区,这样它就可以根据当时的日期自动更改时间。因此,我预计在3月至10月的夏季会增加+1小时,在10月至3月的冬季会增加+0小时

 dt_object =  '20200901-01u30m30s'    
 dt_object = datetime.datetime.strptime(dt_object, '%Y%m%d-%Hu%Mm%Ss') 

 >>>print(dt_object) >>> 2020-09-01 01:30:30 
                             
 timezone= 'Europe/Amsterdam'
 dt_object_tz = pytz.utc.localize(dt_object).astimezone(pytz.timezone(timezone))        
 timeDiff = dt_object_tz.utcoffset().total_seconds()
 official_time = pytz.utc.localize(dt_object_tz+datetime.timedelta(seconds=timeDiff))

 >>>print(official_time) >>> 2020-09-01 03:30:30+00:00 
                             
正如您所看到的,这是一个9月的datetime对象,所以是夏季!,我真的不知道为什么它会增加+2小时而不是1小时。。。。有人能解释一下,告诉我出了什么问题吗

我只想让我的datetime对象具有时区意识,以便它根据抓取中的日期自动从夏季更改为冬季。

关于pytz,请注意,标准库中有。使用Python>=3.9进行时区处理不需要第三方库

然后,如果您的输入代表某个时区的墙时间,您可以只进行本地化。如果输入代表UTC,则可以更轻松地将tzinfo设置为UTC,然后使用astimezone转换为本地时间


您输入例如“20200901-01u30m30s”,它代表UTC还是本地时间,即“欧洲/阿姆斯特丹”中的墙时间?@MrFuppes,即生成/抓取文件的系统时间。我不知道它是什么时区,但我知道冬天它应该等于欧洲/阿姆斯特丹,夏天它应该是+1小时/阿姆斯特丹夏天是UTC+2,冬天是UTC+1,这就是你的意思吗?在代码中,将字符串视为UTC;如果应用astimezone,则可以有效地将UTC转换为指定的时区。@MrFuppes ahh,因为我将其视为UTC,它会增加2小时。那我该怎么处理呢?好的,s不代表UTC,所以我做了你的第一部分。但当我打印dtobj_tz时,我收到了:2020-09-01 01:30:30+02:00@TangerCity:你会期待什么?我会期待2020-09-01 01:30:30+1:00,因为那是夏天的日期,如果是冬天的日期,我会期待2020-12-01 01:30:30+0:00。简短地说:夏季+1,冬季+0。@TangerCity:根据,有DST的是UTC+2,没有DST的是UTC+1。例如,欧洲/伦敦将采用UTC+1/UTC+0,但这意味着我们都假设s为UTC。我不知道我怎么知道它应该是什么
from datetime import datetime, timezone
import pytz

s = '20200901-01u30m30s'    
local_tz = 'Europe/Amsterdam'

# if s represents local time, just localize:
dtobj_tz = pytz.timezone(local_tz).localize(datetime.strptime(s, '%Y%m%d-%Hu%Mm%Ss'))
# datetime.datetime(2020, 9, 1, 1, 30, 30, tzinfo=<DstTzInfo 'Europe/Amsterdam' CEST+2:00:00 DST>)

# if s represents UTC, set it directly:
dtobj_utc = datetime.strptime(s, '%Y%m%d-%Hu%Mm%Ss').replace(tzinfo=timezone.utc)
# ...and convert to desired tz:
dtobj_tz = dtobj_utc.astimezone(pytz.timezone(local_tz))
# datetime.datetime(2020, 9, 1, 3, 30, 30, tzinfo=<DstTzInfo 'Europe/Amsterdam' CEST+2:00:00 DST>)