aniso8601
安装
推荐的安装方法就是使用pip
pip install aniso8601
官方文档
使用
解析日期时间
解析典型的ISO 8601日期时间字符串
In [1]: import aniso8601
In [2]: aniso8601.parse_datetime('1977-06-10T12:00:00Z')
Out[2]: datetime.datetime(1977, 6, 10, 12, 0, tzinfo=+0:00:00 UTC)
Z
表示UTC时间,其他时区用实际时间加时差表示。T
用来连接时间和日期。
可以指定其他定界符,例如空格:
In [3]: aniso8601.parse_datetime('1977-06-10 12:00:00Z', delimiter=' ')
Out[3]: datetime.datetime(1977, 6, 10, 12, 0, tzinfo=+0:00:00 UTC)
支持UTC偏移量:
In [4]: aniso8601.parse_datetime('1979-06-05T08:00:00-08:00')
Out[4]: datetime.datetime(1979, 6, 5, 8, 0, tzinfo=-8:00:00 UTC)
如果未指定UTC偏移量,则返回的日期时间的偏移量为空:
In [5]: aniso8601.parse_datetime('1983-01-22T08:00:00')
Out[5]: datetime.datetime(1983, 1, 22, 8, 0)
目前这个库并不支持解析秒,触发LeapSecondError
错误
aniso8601.parse_datetime('2018-03-06T23:59:60')
解析日期
要解析以ISO 8601字符串表示的日期:
In [7]: aniso8601.parse_date('1984-04-23')
Out[7]: datetime.date(1984, 4, 23)
也支持基本的格式
In [8]: aniso8601.parse_date('19840423')
Out[8]: datetime.date(1984, 4, 23)
使用ISO 8601周日期格式解析日期:
In [9]: aniso8601.parse_date('1986-W38-1')
Out[9]: datetime.date(1986, 9, 15)
W
表示星期
解析ISO 8601的原始日期:
In [10]: aniso8601.parse_date('1988-132')
Out[10]: datetime.date(1988, 5, 11)
解析时间
解析格式化为ISO 8601字符串的时间,请执行以下操作:
In [12]: aniso8601.parse_time('11:31:14')
Out[12]: datetime.time(11, 31, 14)
上述所有方法一样,支持基本格式
In [13]: aniso8601.parse_time('113114')
Out[13]: datetime.time(11, 31, 14)
为以下时间指定UTC偏移量:
In [14]: aniso8601.parse_time('17:18:19-02:30')
Out[14]: datetime.time(17, 18, 19, tzinfo=-2:30:00 UTC)
In [15]: aniso8601.parse_time('171819Z')
Out[15]: datetime.time(17, 18, 19, tzinfo=+0:00:00 UTC)
支持低精度的时间格式
In [16]: aniso8601.parse_time('21:42')
Out[16]: datetime.time(21, 42)
In [17]: aniso8601.parse_time('22')
Out[17]: datetime.time(22, 0)
在ISO 8601格式化时间的最后一个元素上始终允许使用小数。
In [18]: aniso8601.parse_time('22:33.5')
Out[18]: datetime.time(22, 33, 30)
In [19]: aniso8601.parse_time('23.75')
Out[19]: datetime.time(23, 45)
同样,小数部分可以使用逗号而不用点表示。
aniso8601.parse_time('22:33,5')
同样不支持解析秒数
解析持续时间
解析格式为ISO 8601字符串的持续时间,使用parse_duration
:
In [20]: aniso8601.parse_duration('P1Y2M3DT4H54M6S')
Out[20]: datetime.timedelta(days=428, seconds=17646)
其中P
表示时间段,Y 年 M 月 D 日 H 时 M 分 S 秒
对于较低精度的时间
In [21]: aniso8601.parse_duration('P1Y')
Out[21]: datetime.timedelta(days=365)
小数表示解析
In [22]: aniso8601.parse_duration('P1YT3.5M')
Out[22]: datetime.timedelta(days=365, seconds=210)
还支持从组合的日期和时间解析持续时间:
In [23]: aniso8601.parse_duration('P0001-01-02T01:30:5')
Out[23]: datetime.timedelta(days=397, seconds=5405)
解析时间间隔
由开始时间和结束时间指定的间隔,使用parse_interval
:
In [24]: aniso8601.parse_interval('2007-03-01T13:00:00/2008-05-11T15:30:00')
Out[24]: (datetime.datetime(2007, 3, 1, 13, 0), datetime.datetime(2008, 5, 11, 15, 30))
由开始时间和持续时间指定的时间间隔:
In [26]: aniso8601.parse_interval('2007-03-01T13:00:00Z/P1Y2M10DT2H30M')
Out[26]:
(datetime.datetime(2007, 3, 1, 13, 0, tzinfo=+0:00:00 UTC),datetime.datetime(2008, 5, 9, 15, 30, tzinfo=+0:00:00 UTC))
持续时间也可以通过持续时间和结束时间指定:
In [27]: aniso8601.parse_interval('P1M/1981-04-05')
Out[27]: (datetime.date(1981, 4, 5), datetime.date(1981, 3, 6))
请注意,以上解析的结果的顺序是不正确的。如果需要排序间隔,只需使用sorted
如下所示的关键字:
In [28]: sorted(aniso8601.parse_interval('P1M/1981-04-05'))
Out[28]: [datetime.date(1981, 3, 6), datetime.date(1981, 4, 5)]
当需要维持持续时间指定的分辨率时,即将持续时间开始指定为日期,结束时间也将作为日期时间返回:
In [29]: aniso8601.parse_interval('2014-11-12/PT4H54M6.5S')
Out[29]:
(datetime.date(2014, 11, 12),datetime.datetime(2014, 11, 12, 4, 54, 6, 500000))
In [30]: aniso8601.parse_interval('2007-03-01/P1.5D')
Out[30]: (datetime.date(2007, 3, 1), datetime.datetime(2007, 3, 2, 12, 0))
支持重复间隔,并生成一个生成器
In [31]: aniso8601.parse_repeating_interval('R3/1981-04-05/P1D')
Out[31]: <generator object PythonTimeBuilder._date_generator at 0x000002A49338C548>In [32]: list(aniso8601.parse_repeating_interval(&#39;R3/1981-04-05/P1D&#39;))
Out[32]:
[datetime.date(1981, 4, 5),datetime.date(1981, 4, 6),datetime.date(1981, 4, 7)]
R
表示重复的次数。
允许重复间隔为反方向&#xff1a;
In [33]: list(aniso8601.parse_repeating_interval(&#39;R2/PT1H2M/1980-03-05T01:01:00&#39;))
Out[33]: [datetime.datetime(1980, 3, 5, 1, 1), datetime.datetime(1980, 3, 4, 23, 59)]
允许无限制的时间间隔
In [34]: result &#61; aniso8601.parse_repeating_interval(&#39;R/PT1H2M/1980-03-05T01:01:00&#39;)In [35]: next(result)
Out[35]: datetime.datetime(1980, 3, 5, 1, 1)In [36]: next(result)
Out[36]: datetime.datetime(1980, 3, 4, 23, 59)
日期和时间分辨率
在某些情况下&#xff0c;找出ISO 8601日期或时间字符串提供的分辨率可能会很有用。为此提供了两个功能。
要获得ISO 8601时间字符串的分辨率&#xff1a;
In [37]: aniso8601.get_time_resolution(&#39;11:31:14&#39;) &#61;&#61; aniso8601.resolution.TimeResolution.Seconds
Out[37]: TrueIn [38]: aniso8601.get_time_resolution(&#39;11:31&#39;) &#61;&#61; aniso8601.resolution.TimeResolution.Minutes
Out[38]: TrueIn [39]: aniso8601.get_time_resolution(&#39;11&#39;) &#61;&#61; aniso8601.resolution.TimeResolution.Hours
Out[39]: True
同样&#xff0c;对于ISO 8601日期字符串&#xff1a;
In [40]: aniso8601.get_date_resolution(&#39;1981-04-05&#39;) &#61;&#61; aniso8601.resolution.DateResolution.Day
Out[40]: TrueIn [41]: aniso8601.get_date_resolution(&#39;1981-04&#39;) &#61;&#61; aniso8601.resolution.DateResolution.Month
Out[41]: TrueIn [42]: aniso8601.get_date_resolution(&#39;1981&#39;) &#61;&#61; aniso8601.resolution.DateResolution.Year
Out[42]: True
TupleBuilder
在TupleBuilder
返回解析结果作为字符串的元组。它位于aniso8601.builders
模块中。
日期时间
解析日期时间将返回一个元组&#xff0c;其中包含日期元组&#xff08;作为字符串的集合&#xff09;&#xff0c;时间元组&#xff08;作为字符串的集合&#xff09;和“ datetime”字符串。日期元组包含以下解析组件&#xff1a;。时间元组包含以下parse组件&#xff0c;其中是一个元组&#xff0c;其中具有且为boolean 的以下组件&#xff1a;(YYYY, MM, DD, Www, D, DDD, &#39;date&#39;)
(hh, mm, ss, tz, &#39;time&#39;)
tz
(negative, Z, hh, mm, name, &#39;timezone&#39;)
negative
Z
In [43]: from aniso8601.builders import TupleBuilder
In [44]: aniso8601.parse_datetime(&#39;1977-06-10T12:00:00&#39;, builder&#61;TupleBuilder)
Out[44]:
((&#39;1977&#39;, &#39;06&#39;, &#39;10&#39;, None, None, None, &#39;date&#39;),(&#39;12&#39;, &#39;00&#39;, &#39;00&#39;, None, &#39;time&#39;),&#39;datetime&#39;)
日期
解析日期返回一个包含以下解析组件的元组&#xff1a;(YYYY, MM, DD, Www, D, DDD, &#39;date&#39;)
In [45]: aniso8601.parse_date(&#39;1984-04-23&#39;, builder&#61;TupleBuilder)
Out[45]: (&#39;1984&#39;, &#39;04&#39;, &#39;23&#39;, None, None, None, &#39;date&#39;)
In [46]: aniso8601.parse_date(&#39;1988-132&#39;, builder&#61;TupleBuilder)
Out[46]: (&#39;1988&#39;, None, None, None, None, &#39;132&#39;, &#39;date&#39;)
同样的操作也支持时间间隔和持续时间。