ISO8601 Duration

2023-12-29

ISO8601 Duration

:label:python, ISO8601 duration

问题:对于形如YYYYMMDDTHHMMSS的给定参考时间(ref->str),和相应的时间间隔(duration->str)形如P0Y0M0DT0H30M0S,需要得到ref+duration的结果。

可以采用isoduration库来解决相应问题。datetime类型数据可以和Duration类数据直接加减,将ref字符串转化为datetime类型然后将duration字符串转化为Duration对象,最后再加减即可。

参考:

1
%pip install isoduration #需按照isoduration库
1
2
3
4
5
6
7
8
9
10
11
from isoduration import parse_duration
from datetime import datetime

def refAddDuration(ref:str, duration:str)->str:
"""处理ref time和duration相加情况
tgt=ref time + duration
"""
ref=datetime.strptime(ref, "%Y%m%dT%H%M%S")
duration=parse_duration(duration)
ref=ref+duration
return ref.strftime("%Y%m%dT%H%M%S") #返回格式按照自己的需求设定,我需要yyyymmddThhmmss的字符串格式

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
In [1]: from isoduration import parse_duration
...: from datetime import datetime
...:
...: def refAddDuration(ref:str, duration:str)->str:
...: """处理ref time和duration相加情况
...: tgt=ref time + duration
...: """
...: ref=datetime.strptime(ref, "%Y%m%dT%H%M%S")
...: duration=parse_duration(duration)
...: ref=ref+duration
...: return ref.strftime("%Y%m%dT%H%M%S") #返回格式按照自己的需求设定,我需要yyyymmddThhmmss的字符串格式
...:

In [2]: ref="20231201T123059"
...: duration="P0Y2M3DT13H0M0S"
...: print(refAddDuration(ref=ref, duration=duration))
20240205T013059

处理结果如上,值得注意的是duration指定的时间间隔不是一段绝对时间,比如1月1日开始的1个月和2月1日开始的1个月,时间间隔是不同的,如果自己手搓需要注意。

以上内容仅供参考,isoduration 的使用以官方文档为准。