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 for loop with switch语句。。?   java如何从具有循环关系的数据集生成树?   使用s:mvcUrl标记时java Spring启动问题   javascript Wicket调色板水平滚动条在firefox中不显示   java如何清理Maven插件绑定?   java将文件从设备发送到计算机不起作用(文件被破坏)   Java GPU编程的性能   java字符串标记器问题   连接Java LDAP断开连接   java Android GridView将无法确定正确的位置   java AlarmManager在指定时间未显示toast消息   MVC中的java测试外观|断言返回类型   logcat上的java Android运行时错误   java Building Workspace在Eclipse中遇到错误   堆栈溢出尾部递归遗传算法抛出“awteventque0”java。StackOverflowerr语言   java ArrayOutOfBounds测试代码不工作   java有没有像Moodle这样流行的课程管理系统?   java如何从jsp获取xml文件作为响应