写一篇关于时区转换的 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设置的还挺好的,默认不带时区,降低新手的上手度
总体来看,我还是推荐第一种,应该代码写出来还是给人看的
现在推荐第三种了啊