time & datetime 模块
在平常的代码中,我们常常需要与时间打交道。在Python中,与时间处理有关的模块就包括:time,datetime,calendar(很少用,不讲),下面分别来介绍。
在开始之前,首先要说明几点:
一、在Python中,通常有这几种方式来表示时间:
- 时间戳
- 格式化的时间字符串
- 元组(struct_time)共九个元素。由于Python的time模块实现主要调用C库,所以各个平台可能有所不同。
时间戳(timestamp)的方式:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。
元组(struct_time)方式:struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。下面列出这种方式元组中的几个元素:
索引(Index) 属性(Attribute) 值(Values) 0 tm_year(年) 比如2011 1 tm_mon(月) 1 - 12 2 tm_mday(日) 1 - 31 3 tm_hour(时) 0 - 23 4 tm_min(分) 0 - 59 5 tm_sec(秒) 0 - 61 6 tm_wday(weekday) 0 - 6(0表示周日) 7 tm_yday(一年中的第几天) 1 - 366 8 tm_isdst(是否是夏令时) 默认为-1
time模块的方法
- time.localtime([secs]):将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。
- time.gmtime([secs]):和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。
- time.time():返回当前时间的时间戳。
- time.mktime(t):将一个struct_time转化为时间戳。
- time.sleep(secs):线程推迟指定的时间运行。单位为秒。
- time.asctime([t]):把一个表示时间的元组或者struct_time表示为这种形式:'Sun Oct 1 12:04:38 2017'。如果没有参数,将会将time.localtime()作为参数传入。
- time.ctime([secs]):把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。
-
time.strftime(format[, t]):把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。
-
time.strptime(string[, format]):把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。
import time >>>time.time() 1523673134.203531 >>> time.time()/3600/24/365 48.3153624916466 # 可以计算除时间一共走了48年 >>> time.localtime() time.struct_time(tm_year=2018, tm_mon=4, tm_mday=14, tm_hour=10, tm_min=34, tm_sec=56, tm_wday=5, tm_yday=104, tm_isdst=0) >>> a = time.localtime() >>> a time.struct_time(tm_year=2018, tm_mon=4, tm_mday=14, tm_hour=10, tm_min=36, tm_sec=39, tm_wday=5, tm_yday=104, tm_isdst=0) >>> a = time.localtime(1243254325) >>> a time.struct_time(tm_year=2009, tm_mon=5, tm_mday=25, tm_hour=20, tm_min=25, tm_sec=25, tm_wday=0, tm_yday=145, tm_isdst=0) >>> a.tm_year 2018 >>> '%s-%s-%s'%(a.tm_year,a.tm_mon,a.tm_mday) '2018-4-14' >>> time.mktime(a) #转为时间戳 1523673399.0 >>>time.sleep(2) # 让时间停在这里2s再走
>>> time.asctime() 'Sat Apr 14 14:20:05 2018' # 一般不用这个 >>>time.ctime() 'Sat Apr 14 14:20:05 2018' #里面不加时间戳就和上面一样 >>>time.ctime(12434325325) 'Sun Jan 12 03:15:25 2364' >>> time.strftime('%Y-%m-%d') '2018-04-14' # 格式是自己定义的 >>> time.strftime('%Y-%m-%d %H:%M:%S') '2018-04-14 14:36:39' #默认的是当前时间 >>> time.strftime('%Y-%m-%d %H:%M:%S',a) '2009-05-25 20:25:25' # 也可以把时间对象放到后面 >>>s = time.strftime('%Y-%m-%d %H:%M:%S %a') >>>time.strptime(s,'%Y-%m-%d %H:%M:%S %a') time.struct_time(tm_year=2018, tm_mon=4, tm_mday=16, tm_hour=10, tm_min=57, tm_sec=36, tm_wday=0, tm_yday=106, tm_isdst=-1) #反转成时间对象 >>>time.mktime(s2) 1523847456.0
字符串转时间格式对应表
%a | 加上周的名字 |
>>>time.strftime('%Y-%m-%d %H:%M:%S %a') |
%A | 加上周的全称 |
>>>time.strftime('%Y-%m-%d %H:%M:%S %A') '2018-04-16 10:44:26 Monday' |
%p | 时间的上下午 |
>>>time.strftime('%Y-%m-%d %H:%M:%S %p') |
%U | 判断今天是今年的第多少周 |
>>>time.strftime('%Y-%m-%d %H:%M:%S %U') |
%w | 拿到周几, |
>>>time.strftime('%Y-%m-%d %H:%M:%S %w') |
%y | 不带年的前两位 |
>>>time.strftime('%y-%m-%d %H:%M:%S') |
%z | 东八区 |
>>>time.strftime('%Y-%m-%d %H:%M:%S %z') |
%Z |
>>>time.strftime('%Y-%m-%d %H:%M:%S %Z') |
|
datetime模块
datetime模块定义了下面这几个类:
- datetime.date:表示日期的类。常用的属性有year, month, day;(类比于time里的元组那个)
- datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond;
- datetime.datetime:表示日期时间。
- datetime.timedelta:表示时间间隔,即两个时间点之间的长度。
- datetime.tzinfo:与时区有关的相关信息。(这里不详细充分讨论该类,感兴趣的童鞋可以参考python手册)
我们需要记住的方法仅以下几个:
- d=datetime.datetime.now() 返回当前的datetime日期类型
d.timestamp(),d.today(), d.year,d.timetuple()等方法可以调用
2.datetime.date.fromtimestamp(322222) 把一个时间戳转为datetime日期类型
3.时间运算
>>> datetime.datetime.now() datetime.datetime(2018, 10, 1, 12, 53, 11, 821218) #拿到了时间对象 >>> datetime.datetime.now() + datetime.timedelta(4) #当前时间 +4天 datetime.datetime(2018, 10, 5, 12, 53, 35, 276589) >>> datetime.datetime.now() + datetime.timedelta(hours=4) #当前时间+4小时 datetime.datetime(2018, 10, 1, 16, 53, 42, 876275) >>> datetime.datetime.now() + datetime.timedelta(minutes=10) datetime.datetime(2018, 4, 16, 11, 36, 37, 623496)
4.时间替换
举例:从当前时间回到去年的今天
>>> datetime.datetime.now() datetime.datetime(2018, 4, 16, 11, 54, 28, 335401) >>> d = datetime.datetime.now() >>> d.replace() datetime.datetime(2018, 4, 16, 11, 54, 36, 535450) >>> d.replace(year = 2016) datetime.datetime(2016, 4, 16, 11, 54, 36, 535450)
>>> d.replace(year=2999,month=11,day=30)
datetime.datetime(2999, 11, 30)