python的datetime使用时区转换的注意事项
由于做美股的开始,经常用到需要将utc时间转换成美东时间,或者美东时间转换为utc时间。
美东时间涉及到一个夏令时,一个冬令时,不同的阶段与utc时间的时区相差不同的时间段
以前我一直用pytz的三方模块给datetime赋值时区信息,然后生成的对象用astimezone的方法,转换到对应的时区信息的时间
这里有一个比较隐晦的问题,我也刚碰到
from_entered_datetime = datetime.datetime(year=2024, month=6, day=5, hour=14, minute=55, second=0, tzinfo=pytz.timezone('US/Eastern'))
像上面这样,假如我新建了一个这样的时间对象,当这个时间对象用astimezone的方法
比如
from_entered_datetime.astimezone(tz=pytz.utc)
这里就会出现一个问题,无论你的创建的时间在美东的夏令时,还是冬令时,转换的时区的时间差都是一样的,也就是不区分冬令时或者夏令时,可以理解为是一个写入时区具体信息的时间,比如西5区
当如果你创建了一个固定时区的datetime.datetime的时间对象,通过astimezone(tz=pytz.timezone('US/Eastern'))这样的转换,是会根据时间来判断冬令时以及夏令时的。
# 使用pytz的localize方法,将naive datetime对象转换为带有正确时区信息的datetime对象 eastern = pytz.timezone('US/Eastern') from_entered_datetime = eastern.localize(from_entered_datetime_naive)
你可以通过上面的方式来创建一个datetime对象,他应该会根据from_entered_datetime_naive的时间来给这个对象赋值具体夏令时,还是冬令时的时区信息
这可以解决上面的问题
现在好友更好的方案,就是在python3.9以上有的zoneinfo模块
from datetime import datetime from zoneinfo import ZoneInfo # 创建一个当前UTC时间的datetime对象 utc_time = datetime.now(ZoneInfo("UTC")) # 打印UTC时间 print("UTC Time:", utc_time) # 您也可以创建一个指定时间的UTC datetime对象 specific_utc_time = datetime(2024, 6, 5, 14, 55, 0, tzinfo=ZoneInfo("UTC")) # 打印指定的UTC时间 print("Specific UTC Time:", specific_utc_time)
通过zoneInfo创建的时间对象,在使用astimezone的时候,都不会出现问题,而且这个是Python的内置模块,挺好用的
刚刚我又测试了一下,关键的问题就是不要用pytz的时区信息对象,然后用datetime的方法创建时间对象!!!