python对于时间处理,提供了很多内置方法,如time、datetime、calendar等。
在平时学习和工作中,我最常使用的是time和datetime模块,本文就主要介绍下这两个模块的常用方法。
time模块的接口是按照C标准库time.h来实现的,里面有很多程序中经常用到的方法,诸如time.sleep()、time.time()的方法,具体常用方法如下。
接口 | 描述 | 使用场景 |
sleep | 程序暂停时间 接受参数为秒 支持浮点型 |
降低程序调用频率 固定间隔时间执行程序 |
time | 返回unixtime时间戳 返回值浮点型 |
精确获取时间 不同地区时间统一 |
gmtime | 接受unixtime秒数 返回struct_time |
unixtime转字符串的过渡 |
mktime | 接受struct_time 返回struct_time |
字符串转unixtime的过渡 |
strftime | 接受格式fomat 可选,指定struct_time 返回自定义的字符串 |
灵活的终端输出 |
strptime | 接受字符串 返回struct_time |
time模块定义了时间对象——struct_time,很多方法都是围绕它进行计算或者转换,而struct_time在使用时,可指定输出自定义的格式,即fomat。
fomat格式 | 代表值 |
%y | 两位数的年份表示(00-99) |
%Y | 四位数的年份表示(000-9999) |
%m | 月份(01-12) |
%d | 月中的一天(0-31) |
%H | 24小时制小时数(0-23) |
%I | 12小时制小时数(01-12) |
%M | 分钟数(00-59) |
%S | 秒(00-59) |
%f | 微妙(0-999999) |
%a | 本地简化星期名称 |
%A | 本地完整星期名称 |
%b | 本地简化的月份名称 |
%B | 本地完整的月份名称 |
%c | 本地相应的日期表示和时间表示 |
%j | 年内的一天(001-366) |
%p | 本地A.M.或P.M.的等价符 |
%U | 一年中的星期数(00-53)星期天为星期的开始 |
%w | 星期(0-6),星期天为星期的开始 |
%W | 一年中的星期数(00-53)星期一为星期的开始 |
%x | 本地相应的日期表示 |
%X | 本地相应的时间表示 |
%Z | 当前时区的名称 |
%% | %号本身 |
输出当前unixtime时间戳,程序睡眠3秒,再次输出时间戳
time.time()
#输出1430176052.916163
time.sleep(3)
time.time()
#输出1430176055.917925
关于struct_time
time.gmtime()
#输出struct_time,time.struct_time(tm_year=2015, tm_mon=4, tm_mday=27, tm_hour=23, tm_min=10, tm_sec=2, tm_wday=0, tm_yday=117, tm_isdst=0)
#获取昨天时间
time.gmtime(time.time() - 24 * 60 * 60)
#输出struct_time,time.struct_time(tm_year=2015, tm_mon=4, tm_mday=26, tm_hour=23, tm_min=10, tm_sec=21, tm_wday=6, tm_yday=116, tm_isdst=0)
#将struct_time转换成unixtime
#mktime返回的值小数点不再保留,无法精确到毫秒
time.mktime(time.gmtime())
#输出unxitime时间戳,1430147664.0
输出时间为字符串
#'2015-04-28 07:16:07'
time.strftime('%c')
#'Tue Apr 28 07:16:32 2015'
time.strftime('%p %I')
#'AM 07'
#strftime第二个参数接受一个struct_time,可选,默认为当前时间
time.strftime('%B is %m', time.gmtime(time.time() - 24 * 60 * 60))
#'April is 04'
将字符串转换为struct_time
time.strptime('2009 years 06-23 time is 15:30:53', '%Y years %m-%d time is %H:%M:%S')
#time.struct_time(tm_year=2009, tm_mon=6, tm_mday=23, tm_hour=15, tm_min=30, tm_sec=53, tm_wday=1, tm_yday=174, tm_isdst=-1)
相比time模块,datetime提供了更为直观的接口。
time模块定义了时间对象——struct_time,类似datetime中也提供了类似标准,所有操作可根据该对象进行计算和转换。由于datetime接口的灵活性,我们甚至可以拿两个datetime进行减法计算,得到两个时间相隔多少天。这里不再废话,先看一下datetime支持的重要类型吧!
类 | 描述 | 常用属性 |
date | 表示日期 | year month day |
time | 表示时间 | hour minute second microsecond |
datetime | 表示日期时间 | 包含date和time属性 |
timedelta | 表示时间间隔 | days seconds microseconds |
每一个类都提供了很多方法,且这些类拥有通用的方法,知识存储的时间结构可能不一样而已,这里举个例子。
#输出今天
date.today()
#datetime.date(2015, 4, 28)
#依旧输出今天
datetime.today()
#datetime.datetime(2015, 4, 28, 16, 56, 46, 540183)
#指定某一天
date(year = 2020, month = 4, day = 1)
#datetime.date(2020, 4, 1)
#指定某一天,并指定某个分钟,可以看出小时自动设置成0
datetime(year = 2020, month = 4, day = 1, minute = 9)
#datetime.datetime(2020, 4, 1, 0, 0, 9)
由于datetime提供了timedelta类,具体timedelta使用如下。
#timedelta支持三个参数days,seconds,microseconds
#对应的,存储也按照该顺序表示
timedelta(seconds=20)
#datetime.timedelta(0, 20)
#参数若为浮点数,则会计算转换成相应的参数
#day转换为second
timedelta(days = 1.2)
#datetime.timedelta(1, 17280)
#second转换为day
timedelta(seconds = 172800)
datetime.timedelta(2)
通过timedelta,我们可以很灵活的获取各种时间。
#获取五天前的时间
datetime.now() - timedelta(days = 5)
datetime.datetime(2015, 4, 23, 17, 24, 55, 718806)
#获取2000年1月1日距今有多少天
delta = date.today() - date(2000, 1, 1)
delta.days
#5596
timedate的这些对象常用方法如下:
方法名 | 描述 |
replace(year, month, day等) | 替换某个字段的值 |
timetuple() | 返回time模块的struct_time对象 |
weekday() | 返回weekday,数字表示,星期一为0 |
isoformat() | 返回格式如'YYYY-MM-DD’的字符串 |
strftime(fomat) | 自定义格式化字符串 |
代码示例如下:
#获取当前月份一号日期
datetime.now().replace(day = 1)
#datetime.datetime(2015, 4, 1, 17, 48, 53, 194239)
#输出2000年1月1日的unixtime时间
struct_time = date(2000, 1, 1).timetuple()
time.mktime(struct_time)
#946656000.0
#输出字符串,当前日期
date.today().isoformat()
#'2015-04-28'
datetime.today().isoformat()
#'2015-04-28T17:52:57.285370'
print datetime.today().strftime('%Y年%m月%d日 %H小时%M分钟%S秒 %f毫秒')
#2015年04月28日 17小时55分钟37秒 415497毫秒
我们在编写程序的时候,经常需要针对时间类型做转换,比如datetime转换为time,time转换为string等。
对于转换,我从网络上找到了一个清晰的函数梳理图,方便以后我们coding的时候使用。
Leave a Reply