ISO 8601持续时间的操作

isoduration的Python项目详细描述


isoduration:使用iso8601持续时间的操作

PyPI Package

这是什么

iso8601是最常见的一种以文本格式交换日期时间的方法。A 该标准中鲜为人知的方面是持续时间的表示。他们有一个 形状与此类似:

P3Y6M4DT12H30M5S

此字符串表示持续时间为3年6个月4天12小时30分钟, 还有5秒。在

在Python中,iso8601持续时间处理的技术水平或多或少局限于 ^{}提供的内容。我们要做的是 这里实现的是解决isodate(如他们自己所描述的)的缺点 Limitations节),以及一些 我们自己对他们的界面感到烦恼,比如他们的界面缺乏统一性 处理类型,以及使用正则表达式进行解析。在

如何使用它

此包围绕^{}类型旋转。在

给定一个ISO持续时间字符串,我们可以通过使用parse_duration()生成这样的类型 功能:

^{pr2}$

解析持续时间的datetime部分是规则的 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中的持续时间。值得一看。但我们的更酷。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java 401在API URL上带有声明性Http客户端,并带有@Secured(SecurityRule.IS_ANONYMOUS)注释   java如何在Android中创建计时器?   Java8WebStart安全弹出窗口   java会通过以下两种方式导致堆空间耗尽吗?   java项目调度GA:染色体的高效数据结构   java Apache POI:如何在Excel文件中插入列   java在JRE系统库中每个jar扮演什么角色   java如何在抽象类中执行@mock(不是注入mock)   java如何使用opensearch和Lucene发送搜索查询?   java在ApachePOI中处理空列   java广播接收器未接收到目标   java错误ELF类:ELF类64(可能原因:体系结构字宽不匹配)   java调用Web服务(SSL)时出错   用于iot集线器设备固件更新的java Rest API   通过xslt将xml转换为文本文件时引发java异常   Java linux打印问题   Java XML转换器重复行   java从另一个类的方法将数组导入mainActivity类   多线程选择与Java交互的线程   我想在java程序中打印以下格式的文件: