Python时间模块,超实用总结!

上一篇 / 下一篇  2020-09-01 10:56:24

  今天是Python时间模块核心使用逻辑。本篇思维导图如下:
  Python内置一个时间模块datetime,提供我们关于时间的表达。记录时间无所不在,日志文件,程序运行起始时间和时长,销量预测的特征等等,我们都能看到时间的身影。
  这篇专题总结datetime模块最主要用法,希望通过此文,大家使用那些时间处理的常用API时,能信手拈来,不用help函数,不用搜索。
  1. 核心逻辑
  datetime模块提供日期和时间各自分类的对象,日期处理相关的对象date,时间处理相关的time,日期和时间的完整结合对象datetime.
  日期和时间的加减操作得到timedelta对象.
  此时此刻 2020-8-28 21:45,这个时间是本地时间,很明显纽约时间肯定不是此值,柏林时间也肯定不是这个值。Python为支持不同地区的时间表达,特意抽象出tzinfo对象,并有一个默认实现对象.
  以上就是datetime模块的几个核心对象以及对应的现实意义。
  2. date、time和datetime对象
  下面介绍最基本3个对象的最基本用法。首先,从datetime模块导入3个对象
  In [1]: from datetime import date,time,datetime 
  构造一个日期date实例,2020年9月1日:
  In [2]: date(2020,9,1)
  Out[2]: datetime.date(2020, 9, 1)
  构造一个时间time实例,10点10分0秒:
  In [3]: time(10,10,0)                            
  Out[3]: datetime.time(10, 10) 
  构造一个日期+时间的完整datetime实例,2020年9月1日 10点10分0秒:
  In [4]: datetime(2020,9,1,10,10,10)                 
  Out[4]: datetime.datetime(2020, 9, 1, 10, 10, 10) 
  自己构造时间没什么意义,更有意义的是打印当前时间,比如此时程序启动打印下时间,如果程序可能运行十几天,很明显使用日期+时间的完整datetime实例。
  此方法归属于datetime类上的方法,所以无须构造datetime实例,直接如下:
  datetime.today() # datetime类的today方法 
  Out[5]: datetime.datetime(2020, 8, 28, 22, 0, 47, 439509)
  打印结果显示年月日时分秒毫秒 还可以使用类方法now:
  In [6]: datetime.now()                                    
  Out[6]: datetime.datetime(2020, 8, 28, 22, 1, 28, 737166)
  直接打印当前时间,返回日期+时间的字符串结果:
  In [7]: print(datetime.now())                            
  2020-08-28 22:02:57.217572 
  如果我们不想显示毫秒,这就涉及到日期+时间的打印格式化问题。使用datetime类方法strftime(string format time),用法如下:
  In [8]: datetime.strftime(datetime.now(),'%Y-%m-%d %H:%M:%S')                    
  Out[8]: '2020-08-28 22:06:20' 
  这就涉及到打印格式化字符,常用的几个:
  如果读入一个时间列,此时type为str,为了对此作时间运算,需要将其转化为datetime,使用strptime(string parse time),它是datetime的类方法:
  In [11]: datetime.strptime('2020-08-28 22:06:20','%Y-%m-%d %H:%M:%S')            
  Out[11]: datetime.datetime(2020, 8, 28, 22, 6, 20) 
  字符型日期+时间要想正确转化为datetime对象,字符串和格式必须要匹配,否则会抛错:
  In [13]: datetime.strptime('2020-08-28 22:06:20',\ 
                             '%Y/%m/%d %H:%M:%S')  
   
  ValueError: time data '2020-08-28 22:06:20'  
  does not match format '%Y/%m/%d %H:%M:%S' 
  3. 基本运算
  有时需要求偏离某个时间的时间,timedelta对象能满足此需求。
  比如,求当前时间的前12小时的日期+时间。
  首先,导入timedelta类:
  In [15]: from datetime import timedelta      
  直接使用当前时间减去timedelta表示的12小时长度,注意第一个参数的含义为days,所以除以 24:
  In [16]: datetime.now() - timedelta(12/24)                
  Out[16]: datetime.datetime(2020, 8, 28, 10, 22, 44, 287246)
  由上面这个用法,可以总结为:
  datetime1 - timedelta1 = datetime2
  所以 datetime1 - datetime2 = timedelta1,故两个时间相减得到timedelta类型的实例。
  除此之外,还有一个小方法,可能会用到,就是datetime类上的combine方法,它能组合date实例和time实例为datetime实例,如下所示:
  In [17]: datetime.combine(date(2020,9,1),time(10,10,0))   
  Out[17]: datetime.datetime(2020, 9, 1, 10, 10)
  4 关于tzinfo
  为了更好统一全球时间,世界规定了一个UTC时间,即全球统一时间,比如假设与之相比北京时间比它早8小时,曼谷比它早7小时等。
  比如打印当前时间时:
  ```python 
  In [6]: print(datetime.now()) 
  2020-08-28 22:33:35.393709  
  以上显示的这个时间,其实并不完整,我当然明白它是我所在地的时间,但是其他国家的开发者看到这个时间时,或许以为是UTC标准下的时间。若是这样解读,显然会和实际有一个时差问题。
  有的读者会说,我在打印格式化时添加时区信息可以吗,我们实验一下:
  In [19]: datetime.strftime(datetime.now(),\ 
                             '%Y-%m-%d %H:%M:%S %Z')                
  Out[19]: '2020-08-28 22:39:44 ' 
  时区信息为空,所以没能解决问题。之所以时区信息会为空,是因为datetime.now()时未给定tzinfo值。
  所以,我们需要自己重新定义一个tzinfo,即实现一个tzinfo对象。
  此类BJinfo继承tzinfo,然后实现其中的3个方法:
  from datetime import tzinfo 
   
  class BJinfo(tzinfo): 
      """BJinfo""" 
      def utcoffset(self, dt): 
          return timedelta(hours=8) 
   
      def tzname(self, dt): 
          return "UTC 8" 
   
      def dst(self, dt): 
          return timedelta(hours=8)
  此时再打印当前时间时,赋上tzinfo值:
  nowt = datetime.now(tz=BJinfo()) 
  In [32]: In [6]: print(nowt)                                
  2020-08-28 22:52:20.328446+08:00 
  再格式化打印时区信息:
  ...:     '%Y-%m-%d %H:%M:%S %Z')                      
  36]: '2020-08-28 22:52:20 UTC 8' 
  透过时区信息BJinfo 定义的三个方法,便能确认时间2020-08-28 22:52:20是比UTC快8个小时的时区下,所对应的一个时间。
  总结
  以上就是本专题对datetime模块核心对象的使用总结,大纲如下:
  ·核心逻辑
  ·date、time和datetime对象
  ·基本运算
  ·关于tzinfo

TAG: 软件开发 Python

 

评分:0

我来说两句

Open Toolbar