写一篇关于时区转换的 astimezome 的使用

Python 内置的 datetime 模块真的很烂,默认的所有时间出来都是不带时区的,所以一般在时间的处理上面,我一般用三方的 arrow

但由于每次配置环境都要装 arrow 有时候很不方便,就想着尝试使用 datetime,想不到一用 就掉坑了。

 

在一次装换为美东时间的代码中,我尝试如下运行

d = datetime.datetime.utcnow()
tz = pytz.timezone('US/eastern')
us_time = d.astimezone(tz)

想不到这个逻辑是有问题的,还好在代码的运行中发现了该问题

首先跟前面讲的一样,datetime 取得的时间默认都是不带时区的,所以当你得到所谓的 utc 时间其实是一个不带时区的 utc 时间。

当你用 astimezone(tz_info)的时候,Python 的逻辑的是,将这个市区与你系统的时区进行比较,返回该时间

 

简单来说,当你的计算机是东八区,国内的时区,通过 utc 或者的时间会慢 8 个小时,但通过astimezone 的时候,

系统会将你的系统时区与你入参的时区计算,也就是国内比美东快 12 个小时。

所以通过上面的代码,你获取的时间是不对的,安装我的理解,得到的美东时间会慢 8 个小时。

 

从上面的错误可以看到,对于没有时区的 datetime 对象使用 astimezone 是非常危险的,也就是在进行 astimezone 之前需要将 datetime 对象附上时区

下面是两种解决方案

第一种

通过 datetime.datetime.utcnow()然后强制给他赋值一个 0 时区

datetime.datetime.utcnow().replace(tzinfo=pytz.UTC).astimezone(tz)

第二种

将 datetime 或者的时间装换为本地的时区时间,操作非常简单,只要在获取的 now()时间后面加上 astimezone()用默认参数 None

datetime.datetime.now().astimezone().astimezone(tz)

两种方案,一种看不过比较一目了然,但有两个入参,

第二个看过去比较清爽简单

还有第三种,这个更加方便:

 

datetime.datetime.now(tz=tzinfo)

直接在now中添加tz的信息,这样返回的datetime对象就是带时区的,一下子发现,其实datetime设置的还挺好的,默认不带时区,降低新手的上手度

 

 

总体来看,我还是推荐第一种,应该代码写出来还是给人看的

 

现在推荐第三种了啊

 

posted @ 2023-05-14 23:07  就是想学习  阅读(90)  评论(0编辑  收藏  举报