假设我想得到什么时候用规则来庆祝生日.然后,除leap日外,YEARLY的频率工作正常.实际上只有每四年一次.

有什么办法可以直接用rrule处理吗?

from datetime import datetime

from dateutil.rrule import rrule, YEARLY

n = 1

print(list(rrule(freq=YEARLY, count=n + 1, dtstart=datetime(1990, 4, 28))))

print(list(rrule(freq=YEARLY, count=n + 1, dtstart=datetime(1992, 2, 29))))

[datetime.datetime(1990, 4, 28, 0, 0), datetime.datetime(1991, 4, 28, 0, 0)]

[datetime.datetime(1992, 2, 29, 0, 0), datetime.datetime(1996, 2, 29, 0, 0)]

甚至没有提到leap日in the docs的事实使我想知道这是否仅仅是一个bug.

年复一日

这可能会有所帮助,但仅适用于2月28日:

from datetime import datetime

from dateutil.rrule import rrule, YEARLY

n = 5

bday = datetime(1990, 4, 28)

print(list(rrule(freq=YEARLY,

byyearday=bday.timetuple().tm_yday,

count=n + 1,

dtstart=bday)))

bday = datetime(1992, 2, 29)

print(list(rrule(freq=YEARLY,

byyearday=bday.timetuple().tm_yday,

count=n + 1,

dtstart=bday)))

[datetime.datetime(1990, 4, 28, 0, 0), datetime.datetime(1991, 4, 28, 0, 0), datetime.datetime(1992, 4, 27, 0, 0), datetime.datetime(1993, 4, 28, 0, 0), datetime.datetime(1994, 4, 28, 0, 0), datetime.datetime(1995, 4, 28, 0, 0)]

[datetime.datetime(1992, 2, 29, 0, 0), datetime.datetime(1993, 3, 1, 0, 0), datetime.datetime(1994, 3, 1, 0, 0), datetime.datetime(1995, 3, 1, 0, 0), datetime.datetime(1996, 2, 29, 0, 0), datetime.datetime(1997, 3, 1, 0, 0)]

解决方法:

Per RFC section 3.3.10, recurrence instances falling on invalid dates

and times are ignored rather than coerced:

Recurrence rules may generate recurrence instances with an invalid

date (e.g., February 30) or nonexistent local time (e.g., 1:30 AM on a

day where the local time is moved forward by an hour at 1:00 AM). Such

recurrence instances MUST be ignored and MUST NOT be counted as part

of the recurrence set.

由于1991年2月29日从不存在,因此它是无效日期,将被跳过.

这是过时的RFC 2445的限制,之后的版本由RFC 5545取代,而RFC 5545由RFC 7529更新.RFC 7529除其他外,将SKIP参数添加到重复规则中,该规则允许您指定OMIT(默认),BACKWARD或FORWARD . dateutil早于RFC 7529(甚至RFC 5545),并且仍在更新中.您可以在issue #285上跟踪进度.

该特殊问题已在PR #522中得到解决,但PR仍然缺少对一个后备案例的支持,并且尚未合并(截至2018年10月).

对于简单的函数返回年份返回到每月的最后一天的简单情况,我建议改为使用relativedelta(直到发布具有SKIP功能的版本):

from dateutil import relativedelta

from datetime import datetime

def yearly_rule(dtstart, count=None):

n = 0

while count is None or n < count:

yield dtstart + relativedelta.relativedelta(years=n)

n += 1

if __name__ == "__main__":

for dt in yearly_rule(datetime(1992, 2, 29), count=5):

print(dt)

# Prints:

# 1992-02-29 00:00:00

# 1993-02-28 00:00:00

# 1994-02-28 00:00:00

# 1995-02-28 00:00:00

# 1996-02-29 00:00:00

请注意,我在规则中使用的是基准日期时间(dtstart),而不是在上一个结果中加上1年.这样做的原因是relativedelta是有损的,因此在datetime(1995,2,28)中加上relativedelta(years = 1)会得到datetime(1996,2,28).

标签:python-dateutil,rrule,python

python中的leap_Python-规则打破了leap年?相关推荐

  1. 浅谈Python中的编码规则

    注:本人用Python3.4作为学习版本,以下学习心得只适用于Python3.4. 之前拜读了金角大王Alex关于编码的解答,收获颇多.特此致谢,以下仅谈一谈作为一个初学者,对编码的理解. 我所了解的 ...

  2. python中的LEGB 规则

    Python   使⽤    LEGB    的顺序来查找⼀个符号对应的对象 locals    ->   enclosing    function    ->   globals    ...

  3. python中if缩进规则_Python缩进与if语句 空格的魅力

    缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例.if后面跟随条件,如果条件成立,则执行归属于if的一个代码块. 先看C语言的表达方式(注意,这是C,不是Python! ...

  4. Python中的命名规则

    一.Python项目组成 1.顶层的包(类似文件夹). 2.各个模块(Python file). 3.类(class 定义类). 4.变量和方法(函数).其中,方法中也可以定义变量(方法中的变量). ...

  5. python中类型转换的规则_Python 类型转换指南

    一.int型 支持转换为 int 类型的,仅有 float.str.bytes,其他类型均不支持. 1.float -> int 会去掉小数点及后面的数值,仅保留整数部分. 2.str -> ...

  6. python中int函数规则_python数字规则和内建函数

    python字符串补充: 字符串对象须当作参数的方法(非str.capitalize()形式): 1.str(obj)--将对象转化为字符串 2.len(str)--计算字符串长度 3.max(str ...

  7. python中列表相加规则_在Python字典列表中使用公共键/值求和值

    如果有人问过这个问题,请道歉.我在这方面是个新手,但我已经看过一些其他的问题/答案,它们看起来和我的很相似,但找不到一个能起作用的.我试过Counter,但似乎不知道如何保存ID键/值.在 我试图用一 ...

  8. python中int函数规则_python中int函数的用法

    int(x)函数(实际上是一个类,初学者可以将其当成一个函数)中的参数x可以是一个数值,也可以是一个字符串. 如果x是一个数值,那么这个函数就是一个向0取整的函数 ,比如 如果x是一个字符串,intx ...

  9. 理解Python中的继承规则和继承顺序

    先来看一段代码: class First(object):def __init__(self):print ("first")class Second(object):def __ ...

最新文章

  1. 我是如何每周坚持 5 天自学机器学习,并拿到offer的
  2. 【评论】一个老程序员的建议
  3. Android 截屏并写入SD卡中
  4. python四大软件-传智播客解析Python之移动端页面适配四大方式
  5. 卷积神经网络新手指南 2
  6. element from表单个别select 出现 一开始就校验了数据,且有数据还通不过校验,选中的项叉不掉问题。
  7. 内聚的极限: 软件开发的不确定性原理
  8. 让你页面速度飞起来 Web前端性能优化
  9. Struts与Servlet的冲突
  10. ffdshow 源代码分析1 : 整体结构
  11. 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树
  12. 穷爸爸与富爸爸,背后思维的差异
  13. [读书笔记] 代码整洁之道(二)
  14. 【信息论】如何彻底理解信息和熵?
  15. 计算机课做名片怎么做,第7课制作个人小名片(教学设计)
  16. 数据结构-BF算法和KMP算法
  17. 20年intel版mac升级Monterey
  18. Single Round Match 506 Round 1 - Division I, Level Two SlimeXGrandSlimeAuto
  19. oracle-ORA-22922: 不存在的 LOB 值
  20. 计算机发明者的电影,电脑发明的奠基人之一,你了解他的生平吗?这部电影带你走近天才...

热门文章

  1. 运算符——Python
  2. 大数据分析需注意什么问题
  3. 阿里天池用Pandas揭秘美国选民的总统喜好附加题
  4. python 实例化过程_python实例化对象的具体方法
  5. 怎么遍历list集合赋值_Java 集合入门知识
  6. 电脑如何进入bios模式_电脑如何进入bios,你还不收藏?
  7. 小爱同学100个奇葩回复_奇葩”订单分享:谁还不是个有故事的同学了?
  8. oracle sysoper角色,Oracle sys和system用戶、sysdba 和sysoper系統權限、sysdba和dba角色的區別...
  9. python代码解读器_python文章生成器(附源码+讲解)
  10. Java基础问题总结