我尝试了两种不同的场景:
- 我获取
UTC
和Europe/Paris
的当前日期时间,然后我只是转换成字符串,显示02 hours
的差距,这是正确的。
from datetime import datetime
import datetime as dt
import pytz
from dateutil import tz
current_utc = datetime.utcnow()
current_europe = datetime.now(pytz.timezone('Europe/Paris'))
current_utc_str = datetime.strftime(current_utc, "%Y-%m-%d %H:%M")
current_europe_str = datetime.strftime(current_europe, "%Y-%m-%d %H:%M")
print('current_utc',current_utc_str)
print('current_europe',current_europe_str)
结果:
current_utc 2023-03-30 07:01
current_europe 2023-03-30 09:01
- 我创建了一个自定义的UTC日期时间对象,然后将其转换为欧洲/巴黎时区,这里是
01 Hour
差距的结果。
from datetime import datetime
import datetime as dt
import pytz
from dateutil import tz
utc = datetime(2023, 3, 21, 23, 45).replace(tzinfo=dt.timezone.utc)
utc_str = datetime.strftime(utc, "%Y-%m-%d %H:%M")
print("utc_str", utc_str)
from_zone = tz.gettz("UTC")
to_zone = tz.gettz('Europe/Paris')
utc = utc.replace(tzinfo=from_zone)
new_time = utc.astimezone(to_zone)
new_time_str = datetime.strftime(new_time, "%Y-%m-%d %H:%M")
print("new_time_str", new_time_str)
结果:
utc_str 2023-03-21 23:45
new_time_str 2023-03-22 00:45
在获取当前和创建自定义日期时间时,01 hour of variation
背后的原因是什么?
编辑我们如何处理自定义创建的Datetime对象的夏令时(DST) ?
我认为在不同的时区显示时间,这不能回答处理夏令时(DST)。
相差一小时的原因是由于夏令时的调整。欧洲/巴黎时区采用日光节约时间,而UTC不采用。
当您使用datetime.now()函数获取UTC和欧洲/巴黎的当前时间时,pytz模块会自动处理DST调整。因此,UTC和欧洲/巴黎之间的时差被正确地计算为两个小时。
但是,当您创建自定义UTC datetime对象时,您可以使用replace()方法显式地将时区设置为UTC。因此,没有进行夏令时调整,UTC与欧洲/巴黎的时差仅为1小时。
要正确处理DST调整,您可以使用pytz模块获取当前UTC时间,然后将其转换为欧洲/巴黎时区。例如:
import datetime
import pytz
utc_now = datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
paris_now = utc_now.astimezone(pytz.timezone('Europe/Paris'))
此代码将考虑到任何DST调整,为您提供UTC与欧洲/巴黎之间正确的两小时时差。