怎么在python中对时区进行设置?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
首先是几个常见的时间概念
- <李>
格林尼治时间时间:格林威治时间,基准时间
李> <李>UTC时间:协调世界时,全球协调时间,更精准的基准时间,格林尼治时间与基本等同
李> <李>中科中国基准时间:为UTC时间+ 8小时,即UTC时间的0点对应于中国基准时间的8点,即为一般称为东八区的时间
ISO 8601
一种标准化的时间表示方法,表示格式为:YYYY-MM-DDThh: mm: ss±时区,可以表示不同时区的时间,时区部分用Z表示为UTC标准时区。两个例子:
- <李>
1997 - 07 - 16 t08:20:30z表示的是UTC时间的1997年7月16号8:20:30
李> <李> 1997 - 07 - 16 - t19:20:30 +喂饲表示的是东八区时间的1997年7月16号19:20:30
时间戳
1970年1月1日就是UTC + 00:00时区的时刻称为时代,记为0,当前的时间戳即为从时代的时间到现在的秒数,一般叫做时间戳,因此一个时间戳一定对应于一个特定的UTC时间,同时也对应于其他时区的一个确定的时间,因此时间戳可以认为是一个相对安全的时间表示方法。
datetime实践
datetime是python中最基础的一个时间管理包,下面分别利用datetime去实践下对应的时区概念
datetime类型
datetime分成两种类型:
- <李>
天真,本地类型的时间,当datetime中没有指定时区信息时就是这种类型,此类型的时区是根据运行环境确定对应的时区。因此这种类型的时间会因为运行环境的不同而得到不同时间戳
李> <李>,带有时区类型的时间,这种类型的时间对象由于时间和时区都是确定的,因此对应于确定的时间戳
李>举例如下:
得到datetime import datetime,时区 你=,datetime.now () now.tzinfo ,, #, None 时间=utc_now datetime.now (timezone.utc) utc_now.tzinfo #, UTC
可以看到上面的例子中,现在没有指定时区,为天真的类型的时间,其时区与运行环境相关。而utc_now指定了UTC时区,为了解类型的时间。
获取当前时间
- <李>
datetime.now()可用于获取当前时间,支持设置对应的时区,如果不设置时区默认获取的是本地的时间,根据是否指定时区可能穿件出天真的类型的时间或者意识到类型的时间,但是对应的时间戳都是符合预期的。
李> <李> datetime.utcnow()谨慎使用获取是当前UTC对应的时间,但是生成的datetime对象是没有指定时区的,因此使用的是本地时区,创建的是天真的类型的时间,因此如果运行环境为东八区,得到的时间是UTC对应的时间,但是时区是东八区,最终得到的时间会比预期早8个小时,转化得到时间戳也是不符合预期的。
举例如下:
得到datetime import datetime 你=,datetime.now () now.timestamp (), #, 1610035129.323702, unow =, datetime.utcnow () unow.timestamp (), #, 1610006329.323797
最终在2021-01-07 23:58:49在东八区环境下运行上面的代码,now.timestamp()得到时间戳转化为对应的时间为东八区的2021-01-07 23:58:49,但是unow.timestamp()得到的时间戳对应的时间为东八区的2021-01-07 15:58:49,对应于UTC时间2021-01-07 07:58:49,和UTC的当前时间完全对不上。
时间戳操作
- <李>
datetime.timestamp()生成当前时间对应的时间戳
李> <李>datetime.fromtimestamp()根据时间戳生成运行环境时区对应的时间
李> <李> datetime.utcfromtimestamp()谨慎使用根据时间戳生成对应的UTC时间,由于生成的datetime是没有指定时区的,因此获取时间戳看起来得到的是8个小时之前时间的时间戳
对于上面的例子,我们使用前面得到的当前时间戳1610035129进行测试如下:
得到datetime import datetime timestamp =1610035129 时间=d1 datetime.fromtimestamp(时间戳),#,2021 - 01 - 07,23:58:49 d2 =, datetime.utcfromtimestamp(时间戳),#,2021 - 01 - 07,15:58:49
最终得到d1是本地时区正确的时间,但是d2是UTC的是啊金,但是没有指定的时区,因此看起来就是就是本地8个小时前的时间了