ISO 8601持续时间的操作
项目描述
isoduration: ISO 8601持续时间的操作。
这是什么。
ISO 8601最知名的是一种在文本格式中交换日期时间的格式。标准中较少为人所知的一个方面是持续时间的表示。它们的形状类似于以下
P3Y6M4DT12H30M5S
这个字符串表示3年6个月4天12小时30分钟和5秒的持续时间。
Python中ISO 8601持续时间处理的最新技术大致限于isodate
提供的内容。我们在这里试图解决isodate
的不足(如他们在自己的限制部分所述),以及我们对他们接口的一些烦恼,例如在处理类型方面的缺乏一致性,以及使用正则表达式进行解析。
如何使用它。
此软件包围绕Duration
类型。
给定一个ISO持续时间字符串,我们可以通过使用parse_duration()
函数来生成此类类型
>>> from isoduration import parse_duration
>>> duration = parse_duration("P3Y6M4DT12H30M5S")
>>> duration.date
DateDuration(years=Decimal('3'), months=Decimal('6'), days=Decimal('4'), weeks=Decimal('0'))
>>> duration.time
TimeDuration(hours=Decimal('12'), minutes=Decimal('30'), seconds=Decimal('5'))
解析出的持续时间中的 date
和 time
部分只是普通的 dataclass,因此它们的成员可以通过非令人惊讶的方式访问。
除了解析之外,还有许多其他操作可用
- 持续时间可以进行比较和取反
>>> 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 日期时间相加或相减
>>> from datetime import datetime >>> 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 的持续时间字符串
>>> from isoduration import parse_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
无法表示某些持续时间,例如涉及年份或月份的持续时间。由于它不能在不进行危险算术的情况下表示所有可能的持续时间,因此它不是正确的类型。
为什么您不使用正则表达式来解析持续时间字符串?
为什么解析是格式化的逆过程,但反之则不成立?
因为这个美妙的表现不是唯一的。
为什么您支持 <插入一个奇怪的情况>
?
可能是因为标准让我这样做。
为什么您不支持 <插入一个奇怪的情况>
?
可能是因为标准不允许我这样做。
为什么不能从持续时间中减去一个日期时间?
我感到困惑。
为什么我应该使用这个而不是其他东西?
你不应该做互联网上的人告诉你的事情。
为什么 ISO 标准如此奇怪?
是的。
参考。
- XML Schema Part 2: Datatypes, Appendix D:这个令人兴奋命名的文档包含了比任何人都应该理解得更多关于 ISO 8601 的细节。
isodate
:Python 中 ISO 持续时间的原始实现。值得一探究竟。但我们的更酷。
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。
源代码分发
isoduration-20.11.0.tar.gz (11.6 kB 查看散列)
构建分发
isoduration-20.11.0-py3-none-any.whl (11.3 kB 查看散列)
关闭
isoduration-20.11.0.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9 |
|
MD5 | 865d2cb9d07342ea66c75cbf8a425cba |
|
BLAKE2b-256 | 7c1a3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead |
关闭
isoduration-20.11.0-py3-none-any.whl 的哈希值
算法 | 散列摘要 | |
---|---|---|
SHA256 | b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042 |
|
MD5 | c5f76c264bf80cca84b99c48d8af5afb |
|
BLAKE2b-256 | 7b55e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a |