继续上一篇关于时间处理的总结
上一篇主要讲述time模块,今天主要讲datetime模块,相比time模块,功能更为强大、更为优雅简洁。
datetime包括以下几个类:
- date,日期类,常用属性有(year,month,day)
- time,时间类,常用属性有(hour,minute,second,microsecond,tzinfo)
- datetime,日期时间类,继承date类,类似前一篇提到的time模块
- timedelta,表示2个datetime值的差值,常用属性有(days,seconds)
- timezone,与时区相关类,继承 tzinfo类
- tzinfo,与时区相关类
接下来分别讲解
date类
- year取值范围[1,9999],最小值可由
date.min
获得,同理,最大值可由date.max
获得 - month取值范围[1,12]
- day 最大值有year和month值决定,超过规定的值报错
day is out of range for month
- 常用date对象实例方法
- today() 返回当前时区的日期,date对象
- fromtimestamp() 将指定的时间戳转化成date对象
- isoweekday() ,返回date对象日期所处的星期,与日常使用的weekday习惯保持一致
- strftime(),格式化date对象
- replace(),生成一个新的日期对象,原有对象仍保持不变,用参数指定的年,月,日代替原有对象中的属性
- 根据API提供的私有方法可知,date对象可进行加减、比较等操作
d=date.today()
d1=date(2017, 07, 06)
print("当前日期:{},自定义日期:{}".format(d,d1))
print("当前日期:{}对应的星期:{}".format(d,d.isoweekday()))
print("将date对象:{}转化成其他格式:{}".format(d,d.strftime("%Y/%m/%d")))
print("将日期:{}的day替换,替换后:{}".format(d,d.replace(day=23)))
print("日期:{} 与另外一个日期:{}的差值:{}".format(d,d1,(d-d1).days))
#结果
当前日期:2017-07-20,自定义日期:2017-07-06
当前日期:2017-07-20对应的星期:4
将date对象:2017-07-20转化成其他格式:2017/07/20
将日期:2017-07-20的day替换,替换后:2017-07-23
日期:2017-07-20 与另外一个日期:2017-07-06的差值:14
time类
- hour的范围为[0, 24)
- minute的范围为[0, 60)
- second的范围为[0, 60)
- microsecond的范围为[0, 1000000)
- 常见time对象的实例方法的使用同date对象类似
- 根据API提供的私有方法可知,time对象不可进行加减操作,只可进行比较,结果返回True or False
t=time(11,12,12)
print("自定义time对象:{}".format(t))
print("使用默认的格式,格式化time对象:{}".format(t.isoformat()))
#结果
自定义time对象:11:12:12
使用默认的格式,格式化time对象:11:12:12
datetime类
datetime类继承date,包括date与time的所有信息。它的构造函数如下:
datetime.datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )
,各参数的含义与date、time的构造函数中的一样,参数值的范围同date、time
- 常用datetime对象实例方法
- now(tz=None) ,默认返回本地时区的datetime对象,可指定tz,即timezone对象,则返回指定时区的datetime对象
- utcnow() ,返回utc时间(即0时区)的datetime对象
- fromtimestamp(timestamp[, tz]),默认按照本地时区将时间戳转化成datetime对象
- utcfromtimestamp(),默认按照0时区将时间戳转化成datetime对象
- timestamp(dt) ,将datetime对象转化成时间戳,为浮点型
- date(dt),返回datetime对象的日期
- time(dt),返回datetime对象的时间
- strptime(string, format),将指定格式为format的时间字符串转换为datetime对象
- combine(date, time),将date对象和time对象合并成datetime对象
from datetime import *
ptimestamp=1400000000
datestring="2017/11/22 12:22"
now=datetime.now()
utcnow=datetime.utcnow()
date=datetime.date(now)
time=datetime.time(now)
localdatetime=datetime.fromtimestamp(ptimestamp)
utcdatetime=datetime.utcfromtimestamp(ptimestamp)
newformat=datetime.strptime(datestring,"%Y/%m/%d %H:%M")
print("当前时间----本地时区当前时间:{},0时区当前时间:{}".format(now,utcnow))
print("指定datetime对象的日期:{},时间:{}".format(date,time))
print("指定时间戳:{}转化成本地时区对应的datetime对象:{},转化成0时区对应的datetime对象:{}".format(ptimestamp,localdatetime,utcdatetime))
print("指定格式的时间字符串转化成datetime对象:原来:{},现在:{}".format(datestring,newformat))
endtime=datetime.now()
print("2个datetime对象的毫秒时间差:{}".format((endtime-now).microseconds))
print("当前时间:{}基础上计算50天之后的日期时间:{}".format(datetime.now(),datetime.now() + timedelta(days =50)))
#结果
当前时间----本地时区当前时间:2017-07-20 14:47:09.605000,0时区当前时间:2017-07-20 06:47:09.605000
指定datetime对象的日期:2017-07-20,时间:14:47:09.605000
指定时间戳:1400000000转化成本地时区对应的datetime对象:2014-05-14 00:53:20,转化成0时区对应的datetime对象:2014-05-13 16:53:20
指定格式的时间字符串转化成datetime对象:原来:2017/11/22 12:22,现在:2017-11-22 12:22:00
2个datetime对象的时间差:5000
当前时间:2017-07-20 14:47:09.610000基础上计算50天之后的日期时间:2017-09-08 14:47:09.610000
时区的转化参见 pytz
模块,这里不展开深入了解