计算两个日期间隔的天数
datetime模块会有负数
from datetime import datetime
day1 = datetime(2019,2,3)
day2 = datetime(2022,12,30)
# 时间差 —— 必须都是datetime格式的数据 —— 会有负数
print((day1 - day2).days) # -1426
dateutil模块如果end的日期小于start的日期会返回0
from datetime import datetime
# day1 = datetime(2019,2,3)
# day2 = datetime(2022,12,30)
# 时间差 —— 必须都是datetime格式的数据
# print((day1 - day2).days) # -1426
from dateutil import rrule
day1_str = "2020-1-03"
day2_str = "2020-05-05"
day3_str = "2019-05-05"
### 正常情况:结束日期小🌧于开始日期
start_time = datetime.strptime(day1_str,"%Y-%m-%d")
end_time = datetime.strptime(day2_str,"%Y-%m-%d")
days_format = rrule.rrule(freq=rrule.DAILY,dtstart=start_time,until=end_time)
print(days_format)
"""
DTSTART:20200103T000000
RRULE:FREQ=DAILY;UNTIL=20200505T000000
"""
print(days_format.count()) # 124
### 如果结束日期大雨开始日期会返回0
d3_end = datetime.strptime(day3_str,"%Y-%m-%d")
days_format2 = rrule.rrule(freq=rrule.DAILY,dtstart=start_time,until=d3_end)
print(days_format2.count()) # 0
datetime使用笔记
from datetime import datetime,timedelta
# 拿到的是"时间对象"
print(datetime.now())#2019-03-20 15:23:32.883745
# 将时间对象转换为时间戳 后面.是毫秒
f = datetime.now()
s = datetime.timestamp(f)
print(s)#1553066612.883745
# 将时间戳转为时间对象
print(datetime.fromtimestamp(s))#2019-03-20 15:23:32.883745
# 将字符串转换成时间对象
s = '2018-zz-20'
f = datetime.strptime(s,'%Y-%m-%d')
print(f,type(f))#2018-zz-20 00:00:00 <class 'datetime.datetime'>
# 将时间对象转换成字符串,注意跟time的格式不一样!
f1 = datetime.now()
s1 = datetime.strftime(f,'%Y-%m-%d')
print(s1,type(s1))#2018-zz-20 <class 'str'>
### 做运算的是“时间对象”
print(datetime.now() - timedelta(hours=10))
#2019-03-20 05:26:16.183136
print(datetime.now() - timedelta(days=1))
#2019-03-19 15:26:16.183136
日期格式化
- %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 当前时区的名称
- %% %号本身
可以看到,这里的格式化的月份和月份中的天数,默认是2
位数的,也就是说,如果小于10
,就会显示前缀0,如02月09日
。
时间运算相关
import datetime
# 指定时间
print(datetime.datetime(2017,10,1,12,54,11,871281)) # 2017-10-01 12:54:11.871281
now = datetime.datetime.now()
print(now) # 2020-03-16 20:55:10.457931
# 加5天
day5 = now + datetime.timedelta(days=5)
print(day5) # 2020-03-21 20:55:10.457931
# 时间替换
f = now.replace(year=2222,month=3,day=5)
print(f) # 2222-03-05 20:57:28.324392
datetime日期类型比较
from datetime import datetime
# 必须是字符串类型
NOW_STR = datetime.strftime(datetime.now(),"%Y-%m-%d %X")
user_exp_time = "2020-03-14 00:00:00"
# 转换为datetime类型再比较
date_now = datetime.strptime(NOW_STR,"%Y-%m-%d %X")
date_user = datetime.strptime(user_exp_time,"%Y-%m-%d %X")
print(date_now,type(date_now))
print(date_user,type(date_user))
"""
2020-04-09 10:07:50 <class 'datetime.datetime'>
2020-03-14 00:00:00 <class 'datetime.datetime'>
"""
print(date_now > date_user) # True
date.today
from datetime import date
today = date.today()
print(today,type(today)) # 2019-02-22 <class 'datetime.date'>
today_str = today.strftime("%Y-%m-%d")
print(today_str,type(today_str)) # 2019-02-22 <class 'str'>
使用map实现与datetime模块实现日期递推
from datetime import datetime,timedelta
# date_end_time对应的是y_lst最后一个数对应的日期
# 需要得到一个日期列表date_lst中的每个日期值与y_lst中对应上
date_end_time = "2020-05-03"
y_lst = [1,2,43,44,55,66]
date_lst = list(map(lambda x:datetime.strftime(datetime.strptime(date_end_time,"%Y-%m-%d")-timedelta(days=x),"%Y-%m-%d"),range(len(y_lst)-1,-1,-1)))
print(date_lst)
# ['2020-04-28', '2020-04-29', '2020-04-30', '2020-05-01', '2020-05-02', '2020-05-03']