python中的leap_Python-规则打破了leap年?
假设我想得到什么时候用规则来庆祝生日.然后,除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年?相关推荐
- 浅谈Python中的编码规则
注:本人用Python3.4作为学习版本,以下学习心得只适用于Python3.4. 之前拜读了金角大王Alex关于编码的解答,收获颇多.特此致谢,以下仅谈一谈作为一个初学者,对编码的理解. 我所了解的 ...
- python中的LEGB 规则
Python 使⽤ LEGB 的顺序来查找⼀个符号对应的对象 locals -> enclosing function -> globals ...
- python中if缩进规则_Python缩进与if语句 空格的魅力
缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例.if后面跟随条件,如果条件成立,则执行归属于if的一个代码块. 先看C语言的表达方式(注意,这是C,不是Python! ...
- Python中的命名规则
一.Python项目组成 1.顶层的包(类似文件夹). 2.各个模块(Python file). 3.类(class 定义类). 4.变量和方法(函数).其中,方法中也可以定义变量(方法中的变量). ...
- python中类型转换的规则_Python 类型转换指南
一.int型 支持转换为 int 类型的,仅有 float.str.bytes,其他类型均不支持. 1.float -> int 会去掉小数点及后面的数值,仅保留整数部分. 2.str -> ...
- python中int函数规则_python数字规则和内建函数
python字符串补充: 字符串对象须当作参数的方法(非str.capitalize()形式): 1.str(obj)--将对象转化为字符串 2.len(str)--计算字符串长度 3.max(str ...
- python中列表相加规则_在Python字典列表中使用公共键/值求和值
如果有人问过这个问题,请道歉.我在这方面是个新手,但我已经看过一些其他的问题/答案,它们看起来和我的很相似,但找不到一个能起作用的.我试过Counter,但似乎不知道如何保存ID键/值.在 我试图用一 ...
- python中int函数规则_python中int函数的用法
int(x)函数(实际上是一个类,初学者可以将其当成一个函数)中的参数x可以是一个数值,也可以是一个字符串. 如果x是一个数值,那么这个函数就是一个向0取整的函数 ,比如 如果x是一个字符串,intx ...
- 理解Python中的继承规则和继承顺序
先来看一段代码: class First(object):def __init__(self):print ("first")class Second(object):def __ ...
最新文章
- 我是如何每周坚持 5 天自学机器学习,并拿到offer的
- 【评论】一个老程序员的建议
- Android 截屏并写入SD卡中
- python四大软件-传智播客解析Python之移动端页面适配四大方式
- 卷积神经网络新手指南 2
- element from表单个别select 出现 一开始就校验了数据,且有数据还通不过校验,选中的项叉不掉问题。
- 内聚的极限: 软件开发的不确定性原理
- 让你页面速度飞起来 Web前端性能优化
- Struts与Servlet的冲突
- ffdshow 源代码分析1 : 整体结构
- 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树
- 穷爸爸与富爸爸,背后思维的差异
- [读书笔记] 代码整洁之道(二)
- 【信息论】如何彻底理解信息和熵?
- 计算机课做名片怎么做,第7课制作个人小名片(教学设计)
- 数据结构-BF算法和KMP算法
- 20年intel版mac升级Monterey
- Single Round Match 506 Round 1 - Division I, Level Two SlimeXGrandSlimeAuto
- oracle-ORA-22922: 不存在的 LOB 值
- 计算机发明者的电影,电脑发明的奠基人之一,你了解他的生平吗?这部电影带你走近天才...
热门文章
- 运算符——Python
- 大数据分析需注意什么问题
- 阿里天池用Pandas揭秘美国选民的总统喜好附加题
- python 实例化过程_python实例化对象的具体方法
- 怎么遍历list集合赋值_Java 集合入门知识
- 电脑如何进入bios模式_电脑如何进入bios,你还不收藏?
- 小爱同学100个奇葩回复_奇葩”订单分享:谁还不是个有故事的同学了?
- oracle sysoper角色,Oracle sys和system用戶、sysdba 和sysoper系統權限、sysdba和dba角色的區別...
- python代码解读器_python文章生成器(附源码+讲解)
- Java基础问题总结