php培训

新闻中心

行业资讯

Python时间操作都在这里了!
2018-05-10 13:41| | 打印|

       

  python中处理时间的模块有三个,datetime, time,calendar,融汇贯通三个模块,才能随心所欲地用python处理时间。本文就是为此而写,文章着重点在于梳理出三个模块的设计脉络,便于大家记忆里面的api。在需要的时候能够去查找相应的方法。但由于calendar模块使用不多,限于篇幅,本文没有涉及。

  datetime模块主要是用来表示日期的,就是我们常说的年月日时分秒,calendar模块主要是用来表示年月日,是星期几之类的信息,time模块主要侧重点在时分秒,粗略从功能来看,我们可以认为三者是一个互补的关系,各自专注一块。方便用户依据不同的使用目的选用趁手的模块。

  假设我们要将时间表示成毫秒数,比方说1000000毫秒,那有一个问题必须解决,这个1000000毫秒的起点是什么时间,也就是我们的时间基准点是什么时间?好比我说你身高1.8米,那这个身高是指相对于你站立的地面说的。这个时间基准点就是epoch,在Unix系统中,这个基准点就是1970年1月1日0点整那个时间点。

  上面我们说epoch表示1970年的起始点,那这个1970年又是相对于哪个基准时间呢?一般来说,就是相对于格林尼治时间,也叫做GMT(Greenwich Mean Time)时间,还叫做UTC(Coordinated Universal Time),为啥一个时间基准有两个名字?历史上,先有的GMT,后有的UTC.

  UTC是我们现在用的时间标准,GMT是老的时间计量标准。UTC是根据原子钟来计算时间,而GMT是根据地球的自转和公转来计算时间。

  在实际中,我们的计算机中有一个硬件模块RCT,里面会实时记录UTC 时间,该模块有单独的电池供电,即使关机也不影响。

  有了epoch这个时间基准,又有了UTC这个基准的基准,我们就可以精确地表示一个时间了。

  尽管我们已经可以精确地表示一个时间,很多情况下,我们还是要根据地区实际情况对时间进行一个调整,最常见的就是时区,tzone,相信大家都比较熟悉。

  此时,当我们说5点5分这个时间时,还需加上是哪个时区的5点5分才能精确说明一个时间。

  DST 全称是Daylight Saving Time,是说,为了充分利用日光,减少用电,人为地对时间做出一个调整,这取决于不同国家和地区的政策法规。比如说,假设你冬天7点天亮起床,但夏天6点天亮,那么在夏天到来时人为将时间加1个小时,这样就可以让你还是觉得7点起床,但实际上是提前一个小时了。

  那么,好奇的我们,一定要问一问,python是如何知道tzone和DST这两个的值呢?答案是通过环境变量。

  CST+08EDT,M4.1.0,M10.5.0,这个字符串可以做如下解读,用空格分开他们,分成三部分

  第一部分中的CST表示时区的名字,即China Standard Time,也就是我们说的北京时间,+8表示北京时间加上8小时就是UTC时间

  第二部分EDT表示DST的名字,我们说DST是因各个国家地区的政策法规不同而不同的,EDT后面也可以像CST后面一样加一个时间调整值,但由于我们国内只在86年到92年实行过一段时间DST,现在已经废止,所以后面不用加调整时间。

  我们自然而然地想把这个秒数转为年月日时分秒的形式,而这种转换又分两种,一种还是用UTC时间,一种用我们所在时区进行调整后的时间。
 

  
 

  这两个函数如果调用时不传参数,它们内部会调用time.time(),并用返回的秒数做转换。

  相反的,python同样提供了将这两种struct_time转为秒数的方法。

  也就是说mktime方法会先找到系统中的时区和DST信息,并利用这个信息对struct_time进行调整后再换算成秒数。
 

  
 

  除了这两个函数,time模块中还提供了两个简便方法,来帮助将时间转为字符串

  asctime用来将一个struct_time对象转为标准24字符的字符串,如下所示:

  ctime方法与asctime作用相同,只不过它接收的是秒数,在内部,会先把秒数通过localtime转为struct_time,再往后就与asctime一样了。

  time模块解决了时间的获取和表示,datetime模块则进一步解决了快速获取并操作时间中的年月日时分秒信息的能力。

  简单说,该模块核心的类就三个,date类表示年月日,time类表示时分秒毫秒,这里不要和time模块搞混淆了。一句顺口溜可以帮助记清这个情况:

  有一点需要提前说明一下,time类和datetime类都有一个属性,它的值是一个tzinfo对象,里面包含了该time或者datetime的时区信息,一般称这个time或者datetime对象是aware的,它能够准确换算成自epoch开始的秒数。

  如果该属性设置为None,那么,这时的time对象或者datetime对象就没有时区信息,具体它表示的是local time还是utc time,需要我们自己在程序中去决定。

  这里我们所说的local time是指我们所在时区的时间, utc time指的就是国际标准时间,也就是格林尼治时间。下文同。

  这里有一个问题,这个datetime对象究竟是utc的还是local的?

  答案是local的,这是该方法的默认行为。如果你在fromtimestamp方法中传入一个表示时区的参数,即tzinfo对象,就会按传入的时区信息进行转换。

  以上我们得到的都是local的datetime对象,如何获得utc的datetime对象呢?有两个办法

  在实际使用中,我们有一大块需求就是对日期进行比较和加减运算。得益于python的操作符重载能力,python中可以方便地对

  date对象之间,或者datetime对象之间进行小于()比较和减法(-)操作。

  两个date对象作减,或者两个datetime对象之间作减,差值用一个timedelta对象表示。

  同理,一个date 对象或者datetime对象也可以加或者减一个timedelta对象。

  两个timedelta对象之间可加,可减,但不能做大小比较,因为这样没什么意义。

  一个timedelta对象还可以与整数相乘,或通过//操作与一个整数相除。

  本文的目的不在于详细说明python处理时间日期的api如何使用,而是想通过一个概览的形式,让大家抓住time和datetime模块的设计结构,从而能够清楚这些模块提供了哪些能力,在需要的时候能够想起来去用,至于查详细的api,应该是可以轻松解决的。


版权所有:PHP教程,株洲PHP培训,IT培训机构|
扫描二维码
关注PHP培训
官方微信
返回顶部