Python 时间专题

总第272篇原创

1 两个时间模块

python与时间相关的内置模块有: time 和 datetime. 其中,time模块提供各种操作时间的函数,datetime模块定义了如下几个类型:

  • datetime.date:日期类,常用的属性有 year, month, day;

  • datetime.time:时间类,常用的属性有 hour, minute, second, microsecond;

  • datetime.datetime:日期时间;

  • datetime.timedelta:时间间隔,即两个时间点相差长度;

  • datetime.tzinfo:与时区有关的抽象基类

2 时间表达方式

常用的有以下三种,总结如下。

时间戳

第一,时间戳的方式. 相对于1970.1.1 00:00:00, 以秒计算的偏移量, 时间戳是惟一的,如:138267830.87.我看这是网上或大部分博客对时间戳的定义,不过这是不够严谨的,需要考虑所处的时区,此处衡量的时区为UTC(世界标准时间)

为了验证以上逻辑,我们写一个例子:

 
 
  1. dtime3 = datetime.datetime(1970,1,1)

  2. dtime3.timestamp()

预期输出为 0, 因为是相对于1970.1.1 00:00:00的偏移吗,所以预期为0. 可是在本地(中国)输出的时间戳是:-28800.0秒,也就是-8小时,也就是比预期的晚了8个小时。

问题就是处在没有考虑时区上。原定义是相对于UTC时区的,但是我们的datetime.datetime(1970,1,1) 因为没有显示的设置时区,程序会默认按照本地时区计算。

进一步修正:

 
 
  1. dtime2 = datetime.datetime(1970,1,1,tzinfo=timezone.utc)

  2. dtime2.timestamp()

输出为 0.0

在此,我们为tzinfo设置时区为UTC,得到了最严格的时间戳的标准值定义。tzinfo 是datetime模块的抽象基类,上面提到过。

 
 
  1. class tzinfo(builtins.object)

  2. | Abstract base class for time zone info objects.

python内置模块timezone是对tzinfo的一个标准实现类,如cpython中的源码(参考文件:cpython/Lib/datetime.py)

 
 
  1. class timezone(tzinfo):

  2. __slots__ = '_offset', '_name'

时间数组

第二,以数组的形式表示即(structtime). 共有九个元素分别表示。同样,同一个时间戳的structtime会因为时区不同,而不同。

如:time.structtime(tmyear=2013, tmmon=10, tmmday=25, tmhour=13, tmmin=21, tmsec=33, tmwday=4, tmyday=298, tmisdst=0)

前面几个字面意思很清晰,后面四个:

tm_wday:(0-6, Monday is 0)

tm_yday:(day in the year, 1-366)

tm_isdst:(-1, 0 or 1) 0:普通 1:DST夏令时比正常的早一个小时 -1:根据当前时区


可读性最强

最后一种是一种显示型式,也是我们最直观的显示方式,平时使用较多的日期和时间的表达方式。字符串,如:2013-10-25 13:29:39.543000

3 aware 和 naive 时间

这些在第2章节,其实我们已经有所涉及,简单来说aware日期时间会考虑时区等的因素,比如tzinfo设置为UTC后,时间戳就会相对于UTC求一个偏移。而,naive时间日期无法用户设置时区,选用哪个时区完全靠执行代码的系统决定,官方解释:

Whether a naive object represents Coordinated Universal Time (UTC), local time, or time in some other timezone is purely up to the program

4 常用API

理解了上面说的这些日期和时间的基本概念后,再用起来就不会掉坑了,下面总结一些常用的吧,网上这方面的一搜一大把,我尽量整理一个标准版本吧。

整理思路就是按照三种时间日期的表达格式,再有三种表达的相互转换。

4.1 time 模块
 
 
  1. import time


  2. time.time()#获得自己所在时区的当前时间的时间戳

  3. 1382679270.196


  4. time.clock()#3.8要废弃了

  5. 改为使用 time.process_time() 计算cpu的运行时间


  6. time.mktime((2019,5,14, 0,0,0, 0,0,0))#利用mktime函数创建一个时间戳

  7. 1557763200.0, 注意必须是9元组

4.1.1 封装格式函数

提炼使用较多的函数,将任意格式的时间日期字符串,转化为我们熟悉的时间日期格式

 
 
  1. def toMyFormat(inputstr, inputfmt = "%a %b %d %H:%M:%S %Y"):

  2. tstruct = time.strptime(inputstr ,inputfmt) #转化为struct_

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值