ISO 8601持续时间的操作
isoduration的Python项目详细描述
isoduration:使用iso8601持续时间的操作
这是什么
iso8601是最常见的一种以文本格式交换日期时间的方法。A 该标准中鲜为人知的方面是持续时间的表示。他们有一个 形状与此类似:
P3Y6M4DT12H30M5S
此字符串表示持续时间为3年6个月4天12小时30分钟, 还有5秒。在
在Python中,iso8601持续时间处理的技术水平或多或少局限于
^{isodate
(如他们自己所描述的)的缺点
Limitations节),以及一些
我们自己对他们的界面感到烦恼,比如他们的界面缺乏统一性
处理类型,以及使用正则表达式进行解析。在
如何使用它
此包围绕^{
给定一个ISO持续时间字符串,我们可以通过使用parse_duration()
生成这样的类型
功能:
解析持续时间的date
和time
部分是规则的
dataclasses,所以他们的成员可以
以一种不足为奇的方式被访问。在
除了解析它们之外,还有许多其他操作可用:
- 持续时间可以比较和否定:
>>>parse_duration("P3Y4D")==parse_duration("P3Y4DT0H")True>>>-parse_duration("P3Y4D")Duration(DateDuration(years=Decimal('-3'),months=Decimal('0'),days=Decimal('-4'),weeks=Decimal('0')),TimeDuration(hours=Decimal('0'),minutes=Decimal('0'),seconds=Decimal('0')))
在 - 可以在Python日期时间中添加或减去持续时间:
>>>fromdatetimeimportdatetime>>>datetime(2020,3,15)+parse_duration("P2Y")datetime.datetime(2022,3,15,0,0)>>>datetime(2020,3,15)-parse_duration("P33Y1M4D")datetime.datetime(1987,2,11,0,0)
在 - 持续时间是散列的,因此它们可以用作字典键或集合的一部分。在
- 持续时间可以格式化回符合ISO 8601的持续时间字符串:
>>>fromisodurationimportparse_duration,format_duration>>>format_duration(parse_duration("P11YT2H"))'P11YT2H'>>>str(parse_duration("P11YT2H"))'P11YT2H'
在
如何改进
这些步骤(按顺序)应使您进入开发环境:
git clone git@github.com:bolsote/isoduration.git
cd isoduration/
python -m venv ve
. ve/bin/activate
pip install -U pip
pip install -e .
pip install -r requirements/dev.txt
适应自己的喜好和/或需要。在
测试由tox驱动。tox -l
和
仔细阅读tox.ini会让你明白的。在
常见问题解答
为什么P1Y != P365D
?
有些年份有366天。如果不总是一样的,那就不一样了。在
为什么要创建自己的类型,而不是把timedelta
塞满了?
timedelta
不能表示某些持续时间,例如涉及年或月的持续时间。
因为没有危险的算术,它不能代表所有可能的持续时间,那么它
不能是正确的类型。在
为什么不使用正则表达式来解析持续时间字符串呢?
Regular expressions should only be used to parse regular languages.
为什么解析与格式相反,而反之则不然?
因为这种奇妙的表现并不是独一无二的。在
为什么支持<insert here a weird case>
?
可能是因为标准要求我这么做。在
为什么不支持<insert here a weird case>
?
可能是因为标准不允许我这么做。在
为什么不能从持续时间中减去日期时间?
我很困惑。在
我为什么要用这个代替其他的东西?
你不应该做网上人叫你做的事。在
为什么ISO标准如此奇怪?
是的。在
参考文献
- XML Schema Part 2: Datatypes, Appendix D: 这个令人兴奋的命名文件包含了比任何人类都更多的关于ISO8601的细节 应该被允许理解。在
- ^{
} :ISO的最初实现 Python中的持续时间。值得一看。但我们的更酷。在
- 项目
标签: