python渐进-时间模块

python有两个模块可以处理时间相关的事务,一个是time模块,一个是datetime模块,这两个模块的功能高度重合。datetime唯一比time多一点的地方是有个timedelta类,可以指定时间间隔。

19.1 time模块

在操作系统内部,时间是以时间戳的方式来表示的,这个时间戳是一个十位的数字,表示了从1970年0点起的累积秒数。有时候计算机在这个数字后面带上小数,精确到毫秒级别。这种时间戳的方式看起来非常不友好。

time模块用一个struct_time的tuple来表示一个时间。在这个struct_time里面,有九个项,分别是:

tm_year, 年份;

tm_mon, 月份;

tm_mday, 日期;

tm_hour, 小时;

tm_min, 分钟;

tm_sec, 秒;

tm_wday, 一周的第几天,其中周一为0;

tm_yday, 一年的第几天,元旦为1;

tm_isdst,是否夏令时,0是非。

这个tuple略友好,但是信息太多了。

人们大多数乐意看到类似于‘YYYY-MM-DD’、‘/MM/DD/YYYY'之类的表示时间的字符串,这样更好理解。

这就是系统,python的time模块,以及人们日常使用的不同的时间表示方法。time模块提供了很多方法可以获取这三种表示方法,并且提供了不同表示方法之间的转换的函数。

如果想要得到一个当前时间的时间戳,那么可以使用

>>> time.time()1531401870.645407

如果已经有了一个时间戳,想要变成一个struct_time元组,可以使用

>>> time.localtime(1451577600.0)time.struct_time(tm_year=2016, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=1, tm_isdst=0)

如果想要得到一个当前时间的struct_time元组,那么可以使用

>>> time.localtime()time.struct_time(tm_year=2018, tm_mon=7, tm_mday=12, tm_hour=21, tm_min=21, tm_sec=7, tm_wday=3, tm_yday=193, tm_isdst=0)

如果有了一个struct_time元组,想要变成一个更容易看懂的字符串,那么可以使用

>>> time.strftime('%Y-%m-%d')'2018-07-12'>>> time.strftime('%Y-%m-%d',time.localtime(1451577600.0))'2016-01-01'

上面的代码使用了%Y等缩写符来进行排版,一些常用的排版缩写有

%Y,年份;

%m,月份;

%b,月份缩写,如Jan;

%B,月份全称,如January;

%d,日期;

%H,24小时制的小时;

%I,12小时制的小时;

%M,分钟;

%S,秒;

%w,星期几,0是周日,这里相当混乱,因为之前的struct_time是周一为0,估计是不同的人写的代码。如果不喜欢就不要用这个;

%a,星期几的缩写,比如说Mon;

%A,星期几的全称,比如说Monday;

%j,一年中的第几天;

%W,一年中的第几周,周一为第一天;

%U,一年中的第几周,周日为第一天,这两个缩写建议放弃吧,记下来也很费脑子。

实际上常用的就是%Y,%m,%d,%H,%M,%S,%a,%j。有了这几个,基本就可以确定一个struct_time了。

如果已经有了一个表示时间的字符串,想要把它变成struct_time元组,可以使用

>>> tm=time.strptime('2016-01-01','%Y-%m-%d')>>> tmtime.struct_time(tm_year=2016, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=1, tm_isdst=-1)

这个strptime方法和strftime方法是对称操作,一个从时间字符串变成struct_time元组,一个从struct_time元组变成时间字符串。

如果有了一个struct_time元组,想要进一步变成一个时间戳,那么可以使用

>>> time.mktime(tm)1451577600.0

19.2 datetime模块的timedelta类

datetime模块的很多功能都和time重合,连方法都相同。有一点要注意的地方是datetime模块是不支持闰秒的。因此建议依然使用time模块来做绝大部分的时间操作。而有需要用到timedelta功能的时候,可以使用一个字符串构造一个datetime对象,然后借助这个对象使用了timedelta功能之后,可以再转回时间字符串。实例代码如下:

>>> from datetime import datetime>>> dt=datetime.strptime('2016-01-01','%Y-%m-%d')>>> from datetime import timedelta>>> td=timedelta(days=29)>>> dt2=dt+td>>> dt2.strftime('%Y-%m-%d')'2016-01-30'

上面的代码从字符串中构造一个datetime对象,接着构造了一个timedelta,是29天的时间间隔,然后和原来的日期相加得出一个新的datetime对象。例子当中的timedelta是日期的时间间隔,在使用中,可以有years,minutes,seconds等等不同的时间间隔。

本python渐进系列暂告一段落。后续更新内容以及时间待定。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180712G1ZOFQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券