如何将时区添加到日期时间对象?
How to add a timezone to a datetime object?
我有一个从文件中获取日期对象的变量。我的目标是向该对象添加一个时区,以便它根据当时的日期自动更改时间。所以我希望它在夏季(3 月到 10 月之间)添加 +1hour
并在冬季(10 月到 3 月之间)添加 +0hour
。
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 月的日期时间对象(所以是夏令时!),我完全不知道为什么它会增加 +2 小时而不是 1 小时....有人可以解释一下并告诉我哪里出了问题?
我只希望我的日期时间对象能够识别时区,以便它根据抓取的日期自动从夏季更改为冬季。
关于pytz
,注意有zoneinfo in the standard lib. No need for a third party library for time zone handling with Python >= 3.9. Example usage.
然后,如果您的输入表示某个时区的挂钟时间,您就可以进行本地化。如果输入表示 UTC,您可以更轻松地将 tzinfo
设置为 UTC,然后使用 astimezone
.
转换为本地时间
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>)
我有一个从文件中获取日期对象的变量。我的目标是向该对象添加一个时区,以便它根据当时的日期自动更改时间。所以我希望它在夏季(3 月到 10 月之间)添加 +1hour
并在冬季(10 月到 3 月之间)添加 +0hour
。
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 月的日期时间对象(所以是夏令时!),我完全不知道为什么它会增加 +2 小时而不是 1 小时....有人可以解释一下并告诉我哪里出了问题?
我只希望我的日期时间对象能够识别时区,以便它根据抓取的日期自动从夏季更改为冬季。
关于pytz
,注意有zoneinfo in the standard lib. No need for a third party library for time zone handling with Python >= 3.9. Example usage.
然后,如果您的输入表示某个时区的挂钟时间,您就可以进行本地化。如果输入表示 UTC,您可以更轻松地将 tzinfo
设置为 UTC,然后使用 astimezone
.
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>)