推荐使用arrow
包进行日期和时间处理,其方法更简单、更容易理解~
一、模块介绍
- datetime模块包含5个类对象
类名 | 功能说明 |
---|---|
date | 日期对象,常用属性:year、month、day |
time | 时间对象,常用属性:hour、second、minute |
datetime | 日期时间对象,常用的属性:hour、minute、year、day等 |
timedelta | 时间间隔对象,即两个时间点之间的长度 |
tzinfo | 时区信息对象 |
- datetime模块包含2个常量
常量 | 功能说明 | 用法 | 返回值 |
---|---|---|---|
MAXYEAR | 返回能表示的最大年份 | datetime.MAXYEAR | 9999 |
MINYEAR | 返回能表示的最小年份 | datetime.MINYEAR | 1 |
- Python标准库提供的datetime和time侧重点不同,time更加侧重于linux时间戳。
二、date类
(一)类构成
-
date
由year年份、month月份、day日期三部分构成; - 通过
year/month/day
进行数据访问;import datetime a = datetime.date.today() print(a) -- > 2018-07-03 print(a.year) -- > 2018 print(a.month) -- > 7 print(a.day) -- > 3
- 通过属性
__getattribute__(…)
进行数据访问a = datetime.date(2018, 6, 11) a -- > datetime.date(2018, 6, 11) a.__getattribute__('month') -- > 6 a.__getattribute__('day') -- > 11
- date可以作为字典的key,所有的date对象都会被认为是True,也就是 if date 这个判断永远是成立的。
(二)方法与属性
- 日期比较:返回True或False
方法名称 | 方法说明 | 用法 |
---|---|---|
__eq__(...) | 等于(x==y) | x.__eq__(y) |
__ge__(...) | 大于等于(x>=y) | x.__ge__(y) |
__gt__(...) | 大于(x>y) | x.__gt__(y) |
__le__(...) | 小于等于(x<=y) | x.__le__(y) |
__lt__(...) | 小于(x<y) | x.__lt__(y) |
__ne__(...) | 不等于(x!=y) | x.__ne__(y) |
a = datetime.date(2018, 1, 1)
b = datetime.date(2018, 1, 15)
a.__eq__(b)
-- > False
a.__ne__(b)
-- > True
a.__le__(b)
-- >True
- 日期差:返回值类型为datetime.timedelta
方法名称 | 方法说明 | 用法 | 方向 |
---|---|---|---|
__sub__(...) | x - y | x.__sub__(y) | 正向 |
__rsub__(...) | y - x | x.__rsub__(y) | 反向 |
a = datetime.date(2018, 6, 14)
b = datetime.date(2018, 6, 25)
a.__sub__(b)
-- > datetime.timedelta(-11)
a.__sub__(b).days
-- > -11
a.__rsub__(b)
-- > datetime.timedelta(11)
a.__rsub__(b).days
-- > 11
- ISO标准化日期
-
isocalendar()
:返回包含三个值的元组,分别为:year年份、week number周数、weekday星期几(周一为1、周日为7);a = datetime.date(2018, 6, 21) a -- > datetime.date(2018, 6, 21) a.isocalendar() -- > (2018, 25, 4)
-
isoformat()
:返回符合ISO 8601标准(YYYY-MM-DD)
的日期字符串;a = datetime.date(2018, 6, 27) a.isoformat() -- > '2018-06-27'
-
isoweekday()
:返回符合ISO标准的指定日期所在的星期数(周一为1、周日为7),weekday()方法以周日为0;a = datetime.date(2018, 6, 13) a.isoweekday() -- > 3 a.weekday() -- > 2
- 其它常用方法和属性
-
today()
:返回当前日期;datetime.date.today() -- > datetime.date(2018, 7, 3)
-
replace()
:返回一个替换指定日期字段的新date对象(不影响原数据对象),有3个可选参数:year/month/day;a = datetime.date(2018, 6, 17) a.replace(day=4) -- > datetime.date(2018, 6, 4)
-
max
:返回date类能表示的最大的年、月、日的数值;datetime.date.max -- > datetime.date(9999, 12, 31)
-
min
:返回date类能表示的最小的年、月、日的数值。datetime.date.min -- > datetime.date(1, 1, 1)
(三)日期的字符串输出
-
__str__()
:返回日期的字符串; -
ctime()
:返回ctime格式的字符串; -
__format__(...)
:返回指定格式的日期字符串; -
strftime(...)
:返回指定格式的日期字符串,与方法3等价;a = datetime.date(2018, 6, 19) a -- > datetime.date(2018, 6, 19) a.__str__() -- > '2018-06-19' a.ctime() -- > 'Tue Jun 19 00:00:00 2018' a.__format__('%Y/%m/%d') -- > '2018/06/19’ a.strftime('%Y-%m-%d') -- > '2018-06-19'
三、time类
(一)类构成
- 由时hour、分钟minute、秒second、毫秒microsecond、tzinfo五个变量组成;
- 数据访问:可以通过类中的5个变量进行访问,也可以用方法
__getattribute__(…)
访问;a = datetime.time(11, 38, 44,900) a -- > datetime.time(11, 38, 44, 900) a.second -- > 44 a.__getattribute__('minute') -- > 38
(二)方法和属性
- 时间比较:与date类的比较方法一致,如
__eq__(...)
,__ge__(...)
,__gt__(...)
,__le__(...)
,__lt__(...)
,__ne__(…)
; -
__nonzero__()
:判断时间对象是否非零,返回值为True / False; - 其它常用属性:1)
max
:能表示的最大的时间数值;2)min
:能表示的最小的时间数值;3)resolution
:时间间隔单位为分钟;datetime.time.max -- > datetime.time(23, 59, 59, 999999) datetime.time.min -- > datetime.time(0, 0) datetime.time.resolution -- > datetime.timedelta(0, 0, 1)
(三)时间的字符串输出
-
__str__()
:返回时间的字符串; -
isoformat()
:返回符合ISO标准的时间字符串; -
__format__(..)
:返回指定格式的时间字符串; -
strftime(...)
:返回指定格式的时间字符串,与方法3等价;a = datetime.time(12,20,59,899) a datetime.time(12, 20, 59, 899) a.__str__() -- > '12:20:59.000899' a.isoformat() -- > '12:20:59.000899' a.strftime('%H:%M:%S') -- > '12:20:59' a.__format__('%H:%M:%S') -- > '12:20:59'
四、datetime类
(一)类构成:
- 可以看做是
date
类和time
类的合体,大部分的方法和属性都继承于这2个类,其数据构成也是由这2个类的所有属性构成。
(二)专属于datetime的方法和属性
-
now()
:返回当前日期时间的datetime对象; -
date()
:返回datetime对象的日期部分; -
time()
:返回datetime对象的时间部分; -
utcnow()
:返回当前日期时间的UTC的datetime对象;datetime.datetime.now() -- > datetime.datetime(2018, 7, 4, 21, 4, 16, 845663) datetime.datetime.now().date() -- > datetime.date(2018, 7, 4) datetime.datetime.now().time() -- > datetime.time(21, 4, 40, 484204) datetime.datetime.utcnow() -- > datetime.datetime(2018, 7, 4, 14, 22, 28, 841156)
-
combine()
:合并date对象和time对象生成一个datetime对象a = datetime.date(2018, 6, 29) b = datetime.time(22, 14, 15) c = datetime.datetime.combine(a, b) -- > c datetime.datetime(2018, 6, 29, 22, 14, 15)
五、timedelta类
- 类构成:计算2个datetime对象的差值;
- 有7个可选参数,默认值为0:
datetime.timedelta(weeks=0, days=0, hours=0, minutes=0, second=0, microsecond=0, milliseconas=0)
; - 有3个只读属性:1)
timedelta.min
:负数最大时间差;2)timedelta.max
:正数最大时间差;3)timdelta.resolution
:两个时间的最小差值;datetime.timedelta.max --> datetime.timedelta(999999999, 86399, 999999) datetime.timedelta.min --> datetime.timedelta(-999999999) datetime.timedelta.resolution --> datetime.timedelta(0, 0, 1)
六、日期计算
- 获取当前的日期和时间
datetime.datetime.now() -- > datetime.datetime(2018, 7, 4, 22, 41, 58, 620537) datetime.datetime.now().date() -- > datetime.date(2018, 7, 4) datetime.datetime.now().time() -- > datetime.time(22, 42, 35, 429337) datetime.date.today() -- > datetime.date(2018, 7, 4)
- 获取上个月第一天和最后一天的日期
# 上个月最后1天 datetime.date(datetime.date.today().year,datetime.date.today().month,1)- datetime.timedelta(days=1) -- > datetime.date(2018, 6, 30) # 上个月第1天 datetime.date(datetime.date.today().year,datetime.date.today().month-1,1) -- > datetime.date(2018, 6, 1)
- 获取时间差
(datetime.date(2018,6,14) - datetime.date(2018, 6, 29)).days -- > -15 (datetime.datetime.now() - datetime.datetime.now()).seconds -- > 86399
- 获取上周一和周日的日期
# 上周日的日期 datetime.date.today() - datetime.timedelta(days=datetime.date.today().isoweekday()) -- > datetime.date(2018, 7, 1) # 上周一的日期 datetime.date.today() - datetime.timedelta(days=datetime.date.today().isoweekday()+6) -- > datetime.date(2018, 6, 25)
- 计算指定日期当前月最后一天的日期和本月天数
import datetime current_date = datetime.date(2018, 12, 14) def get_date(cur_date): if cur_date.month == 12: next_month_date = datetime.date(cur_date.year + 1, 1, 1) else: next_month_date = datetime.date(cur_date.year, cur_date.month + 1, 1) return next_month_date - datetime.timedelta(days=1) print(get_date(current_date)) -- > 2018-12-31 print(get_date(current_date).day) -- > 31
附录:Python中时间日期格式化符号:
符号 | 说明 |
---|---|
%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) |
%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 | 当前时区的名称 |
%% | %号本身 |