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的方法创建时间对象!!!

posted @ 2024-06-06 19:36  就是想学习  阅读(128)  评论(0编辑  收藏  举报