计算两个日期间隔的天数

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']

博客笔记

分割处理存放连续时间字符串的列表

datetime模块格式化以及去掉前导0的操作说明

pymysql往数据库中插入datetime类型的"空数据"与MySQL5.7sql_mode的一个问题