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渐进系列暂告一段落。后续更新内容以及时间待定。
领取专属 10元无门槛券
私享最新 技术干货