import dateutil import datetime import calendar from dateutil import relativedelta # dateutil下进入报错, 直接从relativedelta进入引用方法 now = datetime.datetime.now() today = datetime.date.today() print(now,today,sep='n') # 2021-12-28 08:33:09.955389 # 2021-12-28 # next day x = now + relativedelta.relativedelta(days=1) print(x) # 2021-12-29 08:33:09.955389 # months=1 -> next month # Next month, plus one week. x = now + relativedelta.relativedelta(months=1,weeks=1) print(x) # 2022-02-04 08:33:09.955389 # Next month, plus one week, at 10am. x = now + relativedelta.relativedelta(months=1,weeks=1,hour=10) print(x) # 2022-02-04 10:33:09.955389 # 指定year = 1 x = now + relativedelta.relativedelta(year=1) print(x) # 0001-12-28 08:33:09.955389
- 参数复数 代表 间隔
- 参数单数 代表 时间改为某个特定时间
# 计算两个datetime类型的时间间隔 y = relativedelta.relativedelta(dt1=datetime.datetime(2020, 1, 1, 10, 0), dt2=today) print(y) # relativedelta(years=-1, months=-11, days=-26, hours=-14) # 因为返回的是元祖, 可以通过y.years获得年份间隔 print(y.years) # -18 # One month before one year. y = now + relativedelta.relativedelta(years=1,months=-1) print(y) # 2022-11-28 08:43:43.310939
# 月维度上的加减不会跳出该月底 y = datetime.datetime(2020,1,31) + relativedelta.relativedelta(months=1) print(y) # 1月底+1月 不会跳出2月 # 2020-02-29 00:00:00
# Next friday y = today + relativedelta.relativedelta(weekday=relativedelta.FR) print(y) # 下一个周五 # Last friday in this month. # 指定本月31号, 往前推一个FR y = today + relativedelta.relativedelta(day=31,weekday=relativedelta.FR(-1)) print(y) # Next wednesday (it’s today!).包含今天是周三 y = today + relativedelta.relativedelta(weekday=relativedelta.WE(+1)) print(y) # 下个周三, 不包括今天 y = today + relativedelta.relativedelta(days=1,weekday=relativedelta.WE(+1)) print(y) # 2020-1-1后10天 y = datetime.date(2020,1,20) + relativedelta.relativedelta(yearday=10) print(y) # 2020-01-10, 以某年第一天计算 y = datetime.date(2020,1,20) + relativedelta.relativedelta(days=20,yearday=10) print(y) # 2020-01-30 y = datetime.date(2020,1,10) + relativedelta.relativedelta(days=10) print(y) # 2020-01-20
- 通过weekday指定周几 weekday=relativedelta.WE(+1)
- 参数用yearday会从前面datetime的1.1号开始计算, 加入参数day不影响结果, 加入days会累加天数
import datetime from dateutil import rrule from pprint import pprint # 以dtstart开始, 取10次, daily取 a = list(rrule.rrule(rrule.DAILY,count=10,dtstart=datetime.date(2020,1,1))) pprint(a) # ... # Every other day, 5 occurrences. # 从dtstart开始, 取5次, 间隔是2, daily取 a = list(rrule.rrule(rrule.DAILY,interval=2,count=5,dtstart=datetime.date(2020,1,1))) pprint(a) # ... # 指定start 和 until , 从开始到结束的每一天 y = list(rrule.rrule(rrule.DAILY,dtstart=datetime.date(2021,1,1),until=datetime.date(2021,2,1))) pprint(y) # ...
- 关于 rrule中byweekday的测试
# bymonth -> 指定哪个月 # 需求: 在一段很长的时间间隔(年)中, 获取某个月中的每个周一 / 周二 ... a = list(rrule.rrule(rrule.YEARLY,bymonth=12,byweekday=0,dtstart=datetime.date(2020,1,1),until=datetime.date(2021,12,31))) pprint(a) # 时间间隔内的周一 # byweekday = 0 -> 周一 # byweekday = 1 -> 周二 # byweekday = 2 -> 周三 # byweekday = 3 -> 周四 # byweekday = 4 -> 周五 # byweekday = 5 -> 周六 # byweekday = 6 -> 周七 # byweekday = 7 越界 # 如果要显示所有的日期 -> 用byweekday = range(7) a = list(rrule.rrule(rrule.YEARLY,bymonth=12,byweekday=range(7),dtstart=datetime.date(2020,1,1),until=datetime.date(2021,12,31))) pprint(a) # same way # 获取一个长时间中 指定某个月中的每一天 a = list(rrule.rrule(rrule.DAILY,bymonth=12,dtstart=datetime.date(2020,1,1),until=datetime.date(2021,12,31))) pprint(a)
# Weekly for 10 occurrences. # 从起始日期开始, 以周的方式取10次 a = list(rrule.rrule(rrule.WEEKLY,count=10,dtstart=datetime.date(2021,1,1))) pprint(a) # Every other week, 6 occurrences. # 从起始日期开始, 以周的方式, 间隔为2 , 取6次 a = list(rrule.rrule(rrule.WEEKLY,interval=2,count=6,dtstart=datetime.date(2021,1,1))) pprint(a)
# 通过byweekday 指定 周几 a = list(rrule.rrule(rrule.WEEKLY,count=10,byweekday=(rrule.WE,rrule.SU),dtstart=datetime.date(2021,1,1))) pprint(a) # Every other week on Tuesday and Thursday, for 8 occurrences. 需要间隔 加入interval # Monthly on the 1st Friday for ten occurrences. a = list(rrule.rrule(rrule.MONTHLY,count=10,byweekday=(rrule.FR(1)),dtstart=datetime.date(2022,1,1))) pprint(a) ''' [datetime.datetime(2022, 1, 7, 0, 0), datetime.datetime(2022, 2, 4, 0, 0), datetime.datetime(2022, 3, 4, 0, 0), datetime.datetime(2022, 4, 1, 0, 0), datetime.datetime(2022, 5, 6, 0, 0), datetime.datetime(2022, 6, 3, 0, 0), datetime.datetime(2022, 7, 1, 0, 0), datetime.datetime(2022, 8, 5, 0, 0), datetime.datetime(2022, 9, 2, 0, 0), datetime.datetime(2022, 10, 7, 0, 0)] ''' # FR(1) -> 第一个周五 # FR(2) -> 第二个周五 # FR(-1) -> 最后一个周五 # FR -> 只要是周五 a = list(rrule.rrule(rrule.MONTHLY,count=10,byweekday=(rrule.FR),dtstart=datetime.date(2022,1,1))) ''' [datetime.datetime(2022, 1, 7, 0, 0), datetime.datetime(2022, 1, 14, 0, 0), datetime.datetime(2022, 1, 21, 0, 0), datetime.datetime(2022, 1, 28, 0, 0), datetime.datetime(2022, 2, 4, 0, 0), datetime.datetime(2022, 2, 11, 0, 0), datetime.datetime(2022, 2, 18, 0, 0), datetime.datetime(2022, 2, 25, 0, 0), datetime.datetime(2022, 3, 4, 0, 0), datetime.datetime(2022, 3, 11, 0, 0)] ''' # Every other month on the 1st and last Sunday of the month for 10 occurrences. # 每个月第一个和最后一个周日, 找十个 a = list(rrule.rrule(rrule.MONTHLY,count=10,byweekday=(rrule.SU(1),rrule.SU(-1)),dtstart=datetime.date(2022,1,1))) pprint(a) ''' [datetime.datetime(2022, 1, 2, 0, 0), datetime.datetime(2022, 1, 30, 0, 0), datetime.datetime(2022, 2, 6, 0, 0), datetime.datetime(2022, 2, 27, 0, 0), datetime.datetime(2022, 3, 6, 0, 0), datetime.datetime(2022, 3, 27, 0, 0), datetime.datetime(2022, 4, 3, 0, 0), datetime.datetime(2022, 4, 24, 0, 0), datetime.datetime(2022, 5, 1, 0, 0), datetime.datetime(2022, 5, 29, 0, 0)] ''' # Monthly on the 2nd and 15th of the month for 5 occurrences. # 每个月的2号和15号, 找5个 a = list(rrule.rrule(rrule.MONTHLY,count=5,bymonthday=(2,15),dtstart=datetime.date(2020,1,1))) pprint(a) ''' [datetime.datetime(2020, 1, 2, 0, 0), datetime.datetime(2020, 1, 15, 0, 0), datetime.datetime(2020, 2, 2, 0, 0), datetime.datetime(2020, 2, 15, 0, 0), datetime.datetime(2020, 3, 2, 0, 0)] '''
- byweekday 可以找周几周几
- bymonthday可以找一月中的几号
# Monthly on the first and last day of the month for 3 occurrences. a = list(rrule.rrule(rrule.MONTHLY,count=5,bymonthday=(1,-1),dtstart=datetime.date(2020,1,1))) pprint(a) ''' [datetime.datetime(2020, 1, 1, 0, 0), datetime.datetime(2020, 1, 31, 0, 0), datetime.datetime(2020, 2, 1, 0, 0), datetime.datetime(2020, 2, 29, 0, 0), datetime.datetime(2020, 3, 1, 0, 0)] ''' # Every 18 months on the 10th thru 15th of the month for 10 occurrences. a = list(rrule.rrule(rrule.MONTHLY,interval=18,count=10,bymonthday=range(10,16),dtstart=datetime.date(2021,1,1))) pprint(a) ''' [datetime.datetime(2021, 1, 10, 0, 0), datetime.datetime(2021, 1, 11, 0, 0), datetime.datetime(2021, 1, 12, 0, 0), datetime.datetime(2021, 1, 13, 0, 0), datetime.datetime(2021, 1, 14, 0, 0), datetime.datetime(2021, 1, 15, 0, 0), datetime.datetime(2022, 7, 10, 0, 0), datetime.datetime(2022, 7, 11, 0, 0), datetime.datetime(2022, 7, 12, 0, 0), datetime.datetime(2022, 7, 13, 0, 0)] ''' # Every Tuesday, every other month, 6 occurrences. a = list(rrule.rrule(rrule.MONTHLY,interval=2,count=6,byweekday=rrule.TU,dtstart=datetime.date(2021,1,1))) pprint(a) ''' [datetime.datetime(2021, 1, 5, 0, 0), datetime.datetime(2021, 1, 12, 0, 0), datetime.datetime(2021, 1, 19, 0, 0), datetime.datetime(2021, 1, 26, 0, 0), datetime.datetime(2021, 3, 2, 0, 0), datetime.datetime(2021, 3, 9, 0, 0)] ''' # Yearly in June and July for 4 occurrences. a = list(rrule.rrule(rrule.YEARLY,count=4,bymonth=(6,7),dtstart=datetime.date(2021,1,1))) pprint(a) ''' [datetime.datetime(2021, 6, 1, 0, 0), datetime.datetime(2021, 7, 1, 0, 0), datetime.datetime(2022, 6, 1, 0, 0), datetime.datetime(2022, 7, 1, 0, 0)] ''' # Every 3rd year on the 1st, 100th and 200th day for 4 occurrences. a = list(rrule.rrule(rrule.YEARLY,count=4,interval=3,byyearday=(1,100,200),dtstart=datetime.date(2021,1,1))) pprint(a) ''' [datetime.datetime(2021, 1, 1, 0, 0), datetime.datetime(2021, 4, 10, 0, 0), datetime.datetime(2021, 7, 19, 0, 0), datetime.datetime(2024, 1, 1, 0, 0)] ''' # Every 20th Monday of the year, 3 occurrences. a = list(rrule.rrule(rrule.YEARLY,count=3,byweekday=rrule.MO(20),dtstart=datetime.date(2021,1,1))) pprint(a) ''' [datetime.datetime(2021, 5, 17, 0, 0), datetime.datetime(2022, 5, 16, 0, 0), datetime.datetime(2023, 5, 15, 0, 0)] ''' # Monday of week number 20 (where the default start of the week is Monday), 3 occurrences. # 第二十周的周一 list(rrule(YEARLY, count=3, byweekno=20, byweekday=MO, dtstart=datetime.date(2021,1,1)))
对于rrule中参数的图解
如果需要第10个周一 -> 指定MO(10)就好了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)